【问题标题】:Retrieving multiple mongo documents from cursor.next() for better performance从 cursor.next() 检索多个 mongo 文档以获得更好的性能
【发布时间】: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


【解决方案1】:

我发现提高性能的最佳方法:

  1. 将每个项目转换为列表
  2. 将该列表附加到列表列表中
  3. 转换为二维 numpy 数组

所以,就我而言,像这样:

xy = pickle.loads(curosor.next()['array']).tolist()
X, Y = [xy[0:-1]], [[xy[-1]]]

for i in range(1000):
    try:
        xy = pickle.loads(cursor.next()['array']).tolist()
    except StopIteration:
        break
    X.append(xy[0:-1])
    Y.append([xy[-1]])

X, Y = np.array(X), np.array(Y)

将我的表现提高了 50 倍。

【讨论】:

    【解决方案2】:

    有一个cursor.toArray() 可以立即返回所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2016-05-09
      • 2011-10-20
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      相关资源
      最近更新 更多