【发布时间】:2016-11-15 06:54:14
【问题描述】:
我有以下代码来收集数组(存储为 Mongo 集合中的腌制文档)并将它们堆叠到 2D numpy 矩阵中:
db = MongoClient()['db']
total = db.command('collStats', 'collection')['count']
collection = db['collection']
X, Y = np.array([]), np.array([])
pipe = [{'$sample': {'size': total}}]
cursor = collection.aggregate(pipe, allowDiskUse=True)
for i in range(1000):
try:
xy = pickle.loads(cursor.next()['array'])
if not np.size(X):
X, Y = xy[0:-1], xy[-1]
else:
X, Y = np.vstack((X, xy[0:-1])), np.vstack((Y, xy[-1]))
except StopIteration:
break
这非常慢。例如,如何从 Mongo 一次读取多个文档?任何其他优化技巧也会很有用
【问题讨论】:
-
您是否对您的代码进行了概要分析,以了解他大部分时间都花在了哪里?你为什么在这里使用
range? -
为什么需要运行“collStats”命令?
$sample也存在一些性能问题。你想做什么? -
@SSDMS,我正在使用
range循环遍历随机样本并将 1000 个文档(以数组形式返回)堆叠到 2D 矩阵。我正在运行collstats命令来了解集合中的文档总数。基本上我希望能够访问集合中的随机文档。它最终是为了将训练示例输入神经网络。$sample的性能问题是什么,我怎样才能在做我想做的事情的同时解决这些问题? -
您可以使用
collection.count()获取集合中的文档数。现在,如果您只需要 1000 个文档,为什么还要将该号码传递给$sample?为什么不{'$sample': {'size': 1000}}?你没有回答我的第一个问题。你profile你的代码了吗?我可以看到您只对每个文档中的“数组”字段感兴趣。$projecting 你的文档只返回那个字段怎么样? -
@SSDMS 我需要能够遍历集合中的每个文档,但我需要从集合中以随机顺序对它们进行采样。 是的,我确实分析了我的代码。大部分时间都花在堆叠数组上——大约是阅读文档时间的 50 倍。我想知道是否有任何方法可以读取大量采样文档(列表)并将它们垂直堆叠为 2D numpy 数组 - 这与转换为的文档列表(列表)基本相同一个 ndarray - 并按顺序执行。
标签: python mongodb python-2.7 numpy