提高从mongodb获取数据的性能

时间:2016-12-15 14:25:03

标签: python mongodb pandas pymongo

earnings = self.collection.find({}) #return 60k documents
----
data_dic = {'score': [], "reading_time": [] }
for earning in earnings:
    data_dic['reading_time'].append(earning["reading_time"])
    data_dic['score'].append(earning["score"])
----
df = pd.DataFrame()
df['reading_time'] = data_dic["reading_time"]
df['score'] = data_dic["score"]

---之间的代码需要4秒才能完成。我该如何改进这个功能?

1 个答案:

答案 0 :(得分:4)

时间由以下部分组成:Mongodb查询时间,用于传输数据的时间,网络往返,python列表操作。您可以优化每个。

一个是减少要转移的数据量。由于您只需要reading_timescore,因此您只能获取它们。如果您的平均文档大小很大,这种方法非常有效。

earnings = self.collection.find({}, {'reading_time': True, 'score': True})

二。 Mongo批量传输有限数量的数据。数据包含多达60k行,传输数据需要多次。您可以调整cursor.batchSize以减少往返次数。

第三,如果可以的话,增加网络带宽。

四。您可以通过利用numpy array来加速。它是一个类似C的数组数据结构,它比python列表更快。按索引预分配固定长度数组和assigne值。这可以在致电list.append时避免内部调整。

count = earnings.count()
score = np.empty((count,), dtype=float)
reading_time = np.empty((count,), dtype='datetime64[us]')
for i, earning in enumerate(earnings):
    score[i] = earning["score"]
    reading_time[i] = earning["reading_time"]

df = pd.DataFrame()
df['reading_time'] = reading_time
df['score'] = score