import asyncio
from motor.motor_asyncio import AsyncIOMotorClient
import pandas as pd
import nest_asyncio
nest_asyncio.apply()
def client_database(address,port,database):
client = AsyncIOMotorClient(address,port)
db = client[database]
return db
async def do_find(db,collection):
cursor = db[collection].find()
count = []
async for document in cursor:
print(list(document.keys()))
count.append(document)
dataframe = pd.DataFrame(count)
dataframe.set_index('_id',inplace=True)
dataframe.to_csv('dataframe.csv') #保存CSV
return dataframe
if __name__ == '__main__':
address = '127.0.0.1' #地址
port = 27017 #端口
database = 'MachineLearning' #数据库名字
collection = 'Movie' #集合名字
db = client_database(address, port, database)
loop = asyncio.get_event_loop()
dataframe = loop.run_until_complete(do_find(db, collection))
我觉得在字典数据转成dataframe,这一点上,应该有很大的优化空间。
方法1:把多个字典转成pandas的dataframe的时候,是一直读取字典数据,把字典全部添加到列表里面然后转成dataframe比较好?【数据量大时候在考虑列表内存会不会溢出呢?】
方法2:还是直接定义一个空字典,把然后把读取到字典转成dataframe,一直读一直拼接到空字典上面,还是这种比较好?【频繁的创建和转换与拼接、也许更加耗IO?】
方法3:在方法1基础上,是否存在比列表更好的数据结构?或者说给列表设置上限、到达上限之后缓存一下然后多次操作之后把多个列表转成array再组合然后转成dataframe(或者不转成array直接转成dataframe?)?