我有一个带有集合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个这样的条目
答案 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