【问题标题】:Idea to speed up array processing加快数组处理的想法
【发布时间】:2018-01-25 08:42:44
【问题描述】:

我想通过处理一个数据集A来创建一个数据集B。因此,A (~ 2 Mio.) 中的每一列都必须以批处理方式(通过神经网络)进行处理,产生 3 个输出,这些输出堆叠在一起,然后例如存储在一个 numpy 数组中。

我的代码如下所示,这似乎不是最好的解决方案。

# Load data
data = get_data()

# Storage for B
B = np.empty(shape=data.shape)

# Process data
for idx, data_B in enumerate(data):
    # Process data
    a, b, c = model(data_B)

    # Reshape and feed in B
    B[idx * batch_size:batch_size * (idx + 1)] = np.squeeze(np.concatenate((a, b, c), axis=1))

我正在寻找加快堆叠或分配过程的想法。我不知道是否可以进行并行处理,因为所有内容最终都应该存储在同一个数组中(排序并不重要)。有没有我可以使用的python框架?

加载数据需要 29 秒(只完成一次),堆叠和分配需要 20 秒,批量大小仅为 2。model 命令需要

【问题讨论】:

  • 我的猜测是处理数据(model 调用)比迭代机制需要更长的时间,包括堆叠。当然,您可以通过执行最少处理的比较运行来测试它。
  • 我知道pandas 框架专注于数据集处理,并允许您有效地转换数据集(在后台使用 numpy 数组)。你可以试试看。
  • 不,事实并非如此。请看我的补充。

标签: python performance numpy parallel-processing database-performance


【解决方案1】:

您的数组形状,尤其是维数不清楚。我可以从代码中的工作原理做出一些猜测。您的时代表明事情非常大,因此内存管理可能是一个大问题。创建大型临时数组需要时间。

data.shape 是什么?至少可能是2d; B 形状一样

B = np.empty(shape=data.shape)

现在您在data 的第一个维度上进行迭代;让我们称它们为行,尽管它们可能是 2d 或更大:

# Process data
for idx, data_B in enumerate(data):
    # Process data
    a, b, c = model(data_B)

a 的性质是什么,等等。我假设数组,其形状类似于data_B。但这只是猜测。

    # Reshape and feed in B
    B[idx * batch_size:batch_size * (idx + 1)] =
         np.squeeze(np.concatenate((a, b, c), axis=1)

要让concatenate 工作,a,b,c 必须是 2d(至少)。让我们猜测它们都是(n,m)。结果是 (n,3m)。为什么要挤?是形状(1,3m)吗?

我不知道batch_size。但是除了 1 之外的任何东西,我认为这都行不通。 B[idx:idx+1, :] = ... 有效,因为 idx 的范围是 B.shape[0],但使用其他值会产生错误。

使用这个批量大小的切片索引,几乎看起来您正试图在一个长的一维数组中串出迭代值,batchsize 每次迭代的值。但这不适合 B 匹配 data 的形状。

抛开这个谜题,我想知道你是否真的需要连接。您可以初始化B,以便您可以直接分配值,例如

B[idx, 0, ...] = a
B[idx, 1, ...] = b
etc

填充后重塑数组是微不足道的。即使是转轴也不会太费时间。

【讨论】:

  • 谢谢,你最后的建议给了我约 30% 的加速!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多