1. 程式人生 > >mongodb 中的"坑"系列 --- 單個文件16M大小限制

mongodb 中的"坑"系列 --- 單個文件16M大小限制

   習慣了使用mongodb中文件(document)儲存方式, 可以靈活的將大量資料存入一個集合中的一條文件中, 這樣可以減少大量的資料冗餘, 不會出現關係性資料庫, 如myslq中表的某一列的資料冗餘. 不過這樣儲存雖好, 但其實也會存在一定的問題, 也就是mongodb中的大小限制, 即單個文件大小不能超過16M. 

    對遇到過這個問題的人來說, 這個16M的'概念'很好理解, 而對於還未意識到這個問題的人來說, 這個'坑' 可能會讓你花時間都難以發現, 因為這又要牽扯到mongodb的另一個儲存機制 ---- 無返回碼. 在 < mongodb 權威指南> 一書中, 作者稱之為離弦之箭. 什麼意思呢, 就是mongodb的插入,刪除等操作, 客戶端向資料庫發出請求之後, 是不需要等待資料庫返回操作是否成功的返回結果. 這也是mongodb插入,更新等操作速度快的原因. 這就導致, 當單個檔案超過16M之後, 程式並不會報錯, 但此時, 資料已經無法插入資料庫了.

上程式碼說明問題:

<span style="font-size:18px;">__author__ = 'ray'

import pymongo
import codecs

def mongo_test():

    fin = codecs.open('test_data.txt', 'r', encoding='UTF-8')   # test_data是一個測試檔案, 檔案大小為1.1M
    count = 0  
    test.insert({'name': 'test', 'max': 0})   
    line = fin.readline()
    try:
        while count < 20:
            test.update({'name': 'test'}, {'$set': {str(count): line}})   # 迴圈中每次插入1.1M的資料
            test.update({'name': 'test'}, {'$inc': {'max': 1}}, True)    
            count += 1
    except Exception as e:
        print count, e
    fin.close()


if __name__ == '__main__':
    client = pymongo.Connection('localhost', 27017)
    conn = client.db_wallpaper
    test = conn.test
    mongo_test()</span>
程式輸出結果為: 
/usr/bin/python2.7 /home/ray/test/mongo_test.py
Process finished with exit code 0

程式並無異常, 此時檢視資料庫結果如下:


其實只插入了14條記錄, 這種隱形的錯誤很難被發現. 

有一種策略可以及時發現這個錯誤, 那就是使用安全驗證, 程式碼很簡單, 把

client = pymongo.Connection('localhost', 27017)  ==>> client = pymongo.Connection('localhost', 27017,safe=True)

這樣就會有安全驗證, 每一次插入會等待上一次的返回結果, 後果就是犧牲mongodb的操作效能. 更新後的結果如下:


而在資料庫中, max的值顯示為15, 也就是後續的操作就終止了. 

===========================分割線==================================

 很多使用了mongodb的程式設計師會對此表示不滿, 認為這樣的設計非常不方便, 因為我們早已經進入了用G, T來衡量資料的時代, 這16M能幹什麼.  不過按照mongodb的設計思路來看, 這樣的限制其實是有助於我們更改不良的資料庫結構設計, 因為筆者在shell中做查詢時, 面對16M的文件, 查詢起來相當慢, 這樣的速度是不能夠忍受的. 

解決辦法:

1: 更改資料表結構, 避免單個文件超過16M, 將資料分開儲存, 反正mongodb也比較適合用冗餘換取效率. 不妨在同一個集合中多建立幾個文件, 分開儲存資訊

2: 使用GridFS儲存大資料量資訊, 具體怎麼做, 下次再說.

如有問題, 歡迎討論指正.

相關推薦

mongodb 的""系列 --- 單個16M大小限制

   習慣了使用mongodb中文件(document)儲存方式, 可以靈活的將大量資料存入一個集合中的一條文件中, 這樣可以減少大量的資料冗餘, 不會出現關係性資料庫, 如myslq中表的某一列的資料冗餘. 不過這樣儲存雖好, 但其實也會存在一定的問題, 也就是mongo

Linux查看各大小命令:du -h --max-depth=1

文件夾大小 avi watermark 屏幕 文件的 形式 abc == 查看 du [-abcDhHklmsSx] [-L <符號連接>][-X <文件>][--block-size][--exclude=<目錄或文件>] [--max

inux查看各大小命令:du -h --max-depth=1

連接 linu 使用情況 ota 目錄名 total 換行 但是 ren du [-abcDhHklmsSx] [-L <符號連接>][-X <文件>][--block-size][--exclude=<目錄或文件>] [--max-de

Windows服務器修改網站上傳大小限制

img spm 管理工具 tab win target log 記事本 結果 ASP程序 方法一: 修改該網站的的最大上傳文件的大小限制 在Windows server上會出現上傳大小受限制的問題,這是由於windows server的IIS管理器做了限制所致,IIS默

IIS 設置傳輸大小限制

http es2017 限制 允許 -1 max .cn com 技術 IIS默認傳輸文件大小為30M,最大允許傳輸為2G. 1.通過webconfig配置節點設置 在IIS 6.0 設置如下配置節點: 但是IIS 7.0-8.0還要做添加如下配置節點才能正確,否則還是默

修改PHP上傳大小限制

php文件 大文件 nbsp 就是 cee bsp itl unknown pos 前面我們了解了如何《使用PHP實現文件上傳和多文件上傳》。不過,在PHP的默認配置情況下,當上傳的文件大小超出一定的限制時,我們將得到如下的錯誤提示信息: Warning: POST Con

MongoDB匹配陣列最後一個子的某屬性

說明 使用到的操作符$slice 文件說明 示例 插入資料 db.users.insert({"books":[{"name":"spring","author":"manA"},{"name":"summer","author":"manB"},{"

學習Mongodb筆記(三)——更新高效的修改器

在MongoDB中,經常會對於文件進行更新,最簡單的更新是用一個新文件完全替換匹配的文件,但是通常我們會對於一小部分更新,所以我們就需要使用原子性的更新修改器,指定對於文件中末些欄位進行更新,更新修改

C語言K&R習題系列——統計每個單詞所包含的字母個數,以直方圖形式輸出

原題: Write a program to print a histogram of the lengths of words in its input. It is easy to draw

WPF查看PDF - 基於開源的MoonPdfPanel (無需安裝任何PDF閱讀器)問題匯總

報錯 博客 mil iss 用法 責任 位置 通過 連接 致敬Yang-Fei—有一個簡單的用法示例: http://www.cnblogs.com/yang-fei/p/4885570.html。 寫MoonPdfPanel的哥們關於這個開源軟件的實現介紹

coredump添加oat的方法

ldr pro cat 結束 sass 偏移 rom oat starting coredump默認不會dump文件映射, 而我們如果要調試oat問題,需要將boot.oat等文件直接加載到core文件裏。 這樣就能方便的在gdb中查詢oat文件中的內容了。 本文將介紹如何

iTextSharp 合並PDF後,無法刪除已經合並的單個

page 關鍵點 fwrite 引用 foreach ntb span read var private void MergePDFFiles(string[] fileList, string outMergeFile) {

android支持多種類型的下載類

context nts 下載 tor oid tracking ref pen art String directoryName = Environment.getExternalStorageDirectory().toString()

ASP.NET Web Application使用鏈接

快速 構建 remove linked link lsp rep 增加 是我 最近重構一個內部的平臺系統,作為一個平臺,其下有幾個子系統,每個子系統有自己的網站系統。而每個網站使用的是統一的風格,統一的驗證機制,反饋系統,等等。所以,為了避免幾個子系統中重復出現相同的資源或

【springmvc】springmvc如何上傳

doc 問題 ffffff color 遍歷 -c tip int imu 使用到的組件:可自行根據情況選擇版本 <!--上傳依賴包--> <dependency> <groupId

[LeetCode] Find Duplicate File in System 在系統尋找重復

rec number odi test input info mean sam digi Given a list of directory info including directory path, and all the files with contents

Java代碼解壓RAR

tor com .get port void www pri println () [java] view plaincopy import java.io.File; import java.io.FileOutputStream; import d

java webprojectlogback換配置的路徑

tro try gpo rip doc work scan match -a 本人小站點: http://51kxd.com/ 歡迎大家不開心的時候訪問訪問,調節一下心情 web.xml中配置: <!-- windows log

git 恢復單個的歷史版本

file index 信息 csdn 慎用 trac alt plain lean 首先查看該文件的歷史版本信息:git log [email protected]/* */ 記錄下需要恢復的commit版本號:如 9aa51d89799716aa68cff3

SSM:spring+springmvc+mybatis框架的XML配置功能詳細解釋

con initial -m and 整理 .get 尺寸 internal 頁面 SSM:spring+springmvc+mybatis框架中的XML配置文件功能詳細解釋 2016-04-14 23:40 13030人閱讀 評論(2) 收藏 舉報