[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+模