1. 程式人生 > >[python] mongodb 儲存優化 --- 文件設計

[python] mongodb 儲存優化 --- 文件設計

結論:面對大量不需要作為中間值計算,僅是作為記錄存下來的資訊建議使用string字串儲存,而不直接使用字典,列表等結構直接存入資料庫。

mongodb的文件具有很好的拓展性,給我們儲存帶來了便利, 但是當資料量到達一定範圍後,比如我在使用中,達到1000W條記錄,或者儲存大小超過5G之後,就不得不考慮一下優化問題。做了一個簡單的測試,程式碼如下。

測試物件:用string儲存與用字典dict儲存對比

測試方法:模擬5w個欄位,第一種方法拼接為一個大的string串儲存資料,比如&1718-0-0-0&1882-1-1-1, 另一種用字典儲存{1718: [0, 0, 0], 1882: [1, 1, 1]}  然後利用迴圈插入5000條重複記錄。 測試查詢的時候,遍歷每一條記錄。

測試環境:win8.1  4G記憶體   東芝SSD128G(如果程式碼執行結果差異可能是固態硬碟和機械硬碟的差異)  查詢工具:MongoVUE  mongodb 2.6.3

測試程式碼:

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

import pymongo
import random

def test():
    db = conn.test
    str_a = ''
    for i in range(0, 49999):
        str_a += '&' + str(i) + '-1-0-0'
    for i in range(0, 4999):
        db.insert({'a': str_a, 'num': i})
    db.create_index('num')


def test_list():
    db = conn.test1
    list_a = {}
    for i in range(0, 49999):
        list_a[str(i)] = [1, 0, 0]
    for i in range(0, 4999):
        db.insert({'a': list_a, 'num': i})
    db.create_index('num')


def update():
    db = conn.test1
    list_num = []
    for i in range(0, 99):
        num = random.randrange(1, 29999)
        list_num.append(num)
    logs = db.find()
    count = 0
    for log in logs:
        try:
            if log['num'] in list_num:
                print log['num'],
                count += 1
        except Exception as e:
            print e
    print count

if __name__ == '__main__':
    client = pymongo.Connection()
    conn = client.test
    import profile
    profile.run("update()")</span>

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

結果:可見效率非常明顯。 string對應test, dict對應test1


原因分析:

猜測在儲存list或者ditc結構時,雖然mongodb直接使用BSON格式,但是依舊需要保留資料資訊,比如鍵值對資訊等,這佔據了空間,也導致查詢變慢。 這需要檢視mongodb的文件,具體下一篇再講。

===========================結果截圖=========================


整個過程還有很多細節有待考究,其中錯誤希望指出!

相關推薦

[python] mongodb 儲存優化 --- 設計

結論:面對大量不需要作為中間值計算,僅是作為記錄存下來的資訊建議使用string字串儲存,而不直接使用字典,列表等結構直接存入資料庫。 mongodb的文件具有很好的拓展性,給我們儲存帶來了便利, 但是當資料量到達一定範圍後,比如我在使用中,達到1000W條記錄,或者儲存大

python--學習筆記7 格式、數據讀取、儲存

字段 message series index 正則表達式 ESS 對象 之一 pan 讀取文本類數據 pandas提供了一些將表格型數據讀取為DataFrame對象的函數。read_csv 默認分隔符為逗號, read_table 默認分隔符為制表符 "\t" 類型

python將一個txt的內容轉為字典格式/將字典格式儲存到txt

# -*- encoding: gbk -*- def load_dict_from_file(filepath): _dict = {} try: with

python 讀寫txt並用jieba庫進行中文分詞

mage 亂碼 技術分享 流行 ictclas 函數 結果 class 配置 python用來批量處理一些數據的第一步吧。 對於我這樣的的萌新。這是第一步。 #encoding=utf-8 file=‘test.txt‘ fn=open(file,"r") print f

Python 之 讀取txt

open new python pro 文件 div content 調用 close 本文直接給出三種實現方法,代碼例如以下。 方法一: f = open("Proc_Data.txt") # 返回一個文件對象 line = f.readl

python之import子目錄

人的 arch 問題: admin 創建 pro 最簡 pack erro 問題: 在pre_tab.py文件下: print("AA") from test.te import login1 login1() from test.te impo

python實現修改配置

odi 並且 mode info ack hide 配置 rdf 讀取 python實現修改配置文件 原配置文件 global log 127.0.0.1 local2 daemon maxconn 256

Python基礎:Python函數、操作、遞歸

文件處理 r+ lose 獲取 表示 pyw 全部 truncate 模塊 函數參數函數參數包括位置參數,關鍵字參數,動態參數(*args, **args)三種。傳參的過程是形式參數的賦值。*args傳入的參數是元組形式,**args傳入的參數是字典形式。示例代碼如下:(這

Python Day2 基礎 操作

font -a 方式 復制 定義 count 較高的 pri 字典 1.列表、元組 操作 推薦書籍 追風箏的人 白鹿原

Python(day5)操作

second 速度 引號 day5 blog 區別 返回 我們 log 一、文件處理流程 打開文件,得到文件句柄並賦值給一個變量 通過句柄對文件進行操作 關閉文件 二、文件打開模式 打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄,日後通過此

python json及mysql——讀取json存sql、數據庫日期類型轉換、終端操縱mysql及python codecs讀取大問題

temp extra log urn xtra mysql 程序 pre 安裝mysql preface: 近期幫師兄處理json文件,須要讀到數據庫裏面,以備其興許從數據庫讀取數據。數據是關於yelp站點裏面的: https://github.com/Yelp/d

os.path python使用遍歷

root 文件信息 lba arc 輸出 import nsh ive oot import os import os.path rootdir = “d:\data” # 指明被遍歷的文件夾 for p

python open打開的方式

poe automatic 單位 body lin als 通用 將他 hello open/文件操作f=open(‘/tmp/hello‘,‘w‘)#open(路徑+文件名,讀寫模式)#讀寫模式:r只讀,r+讀寫,w新建(會覆蓋原有文件),a追加,b二進制文件.常用模式如

python之創建寫入內容

class 重名 pen true adl blog open ont 數據 #!/usr/bin/python #-*-conding-*- #創建文件,並寫入數據:要求不能與現存系統文件重名 import os def makefile(path,content)

python + selenium -- 讀取配置內容

mic erl fire python ref www Coding __main__ 文件路徑 任何一個項目,都涉及到了配置文件和管理和讀寫,python 支持很多配置文件的讀寫。本文記錄使用 python + selenium自動化過程中,學習的使用py

【轉】python qt(pyqt)的打開、保存、夾選擇對話框

utf spl 文件對話框 出現 tin ans none 轉換 選擇文件夾 import PyQt4.QtCore,PyQt4.QtGui # 獲取文件路徑對話框 file_name = QFileDialog.getOpenFileName(self,"open

Python將一個大按段落分隔為多個小的簡單方法

解決 list 之前 一點 open ews 切片 compile popu 今天幫同學處理一點語料。語料文件有點大,而且是以連續兩個換行符作為段落標誌,他想把它按段落分隔成多個小文件。即每3個段落組成一個新文件。因為曾經沒有遇到過類似的操作,在網上找了

python SimpleHTTPServer 快速共享

logs simple code 共享目錄 python mage cal 文件的 命令 簡單介紹 通過一個python命令快速共享文件給他人。 操作步驟 1、打開cmd命令行,切換到需要共享文件的目錄,執行命令 python -m SimpleHTTPServer 。 2

Python學習筆記之和流

關閉 write finall 存儲路徑 大文件 描述 可選參數 針對 硬盤 打開文件:open(name[,mode[,buffering]]),返回一個文件對象,模式(mode)和緩沖(buffering)是兩個可選參數。 假設有一個名為somefile.txt的文件,

Python 第十三節 操作

都是 bsp color 數據 每次 round write 參數 寫入文件 A 1、首先文件讀寫操作有以下幾種模式: a\a+ w\w+ r\r+ a模式:追加_寫入模式,寫入指針默認在開頭,如果文件存在將在開頭追加寫入,如果文件不存在將創建文件再寫入。 a+模