从MongoDB创建.csv文件的有效方法

时间:2019-12-26 23:58:47

标签: python python-3.x mongodb

我有一个带有集合media_mongo的MongoDB(main_hikari)和内部很多数据。我正在尝试使一个函数从该数据asap创建一个.csv文件。我正在使用此代码,但是这会花费太多时间和CPU使用率


import pymongo
from pymongo import MongoClient



mongo_client = MongoClient('mongodb://admin:password@localhost:27017')
db = mongo_client.media_mongo


def download_file(down_file_name="hikari"):
    docs = pd.DataFrame(columns=[])
    if down_file_name == "kokyaku":
        col = db.main_kokyaku
    if down_file_name == "hikari":
        col = db.main_hikari
    if down_file_name == "hikanshou":
        col = db.main_hikanshou

    cursor = col.find()
    mongo_docs = list(cursor)
    for num, doc in enumerate(mongo_docs):
        doc["_id"] = str(doc["_id"])
        doc_id = doc["_id"]
        series_obj = pandas.Series(doc, name=doc_id)
        docs = docs.append(series_obj)


    csv_export = docs.to_csv("file.csv", sep=",")

download_file()

我的数据库具有这种格式的数据(对不起日语:D)

_id:"ObjectId("5e0544c4f4eefce9ee9b5a8b")"
事業者受付番号:"data1"
開通区分/処理区分:"data2"
開通ST/処理ST:"data3"
申込日,顧客名:"data4"
郵便番号:"data5"
住所1:"data6"
住所2:"data7"
連絡先番号:"data8"
契約者電話番号:"data9"

大约有150000个这样的条目

1 个答案:

答案 0 :(得分:1)

如果您指示的数据很多,那么此行会伤害您:

    mongo_docs = list(cursor)

这基本上意味着立即将 entire 集合读入客户端数组。这将创建一个巨大的内存高水位标记。

更好地使用如上所述的mongoexport或自己移动光标,而不用list()吞噬整个内容,例如:

cursor = col.find()
for doc in cursor:
    # read docs one at a time 

或对此非常了解:

for doc in col.find():  # or find(expression of your choice)
    # read docs one at a time