想要加快阵列处理速度

时间:2018-01-25 08:42:45

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

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

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

myapp.com/tenant-1/dashboard, 
myapp.com/tenant-2/dashboard.

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

加载数据需要29s(仅执行一次),堆叠和分配需要20秒,批量大小仅为2. model 命令采用&lt; 1s,分配数组需要5s,所有其他部分<1s。

1 个答案:

答案 0 :(得分: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,但如果使用其他值,则会产生错误。

使用此批量大小的片段索引,它几乎看起来像是在尝试在长1d数组中输出迭代值,每次迭代B值。但这并不适合data匹配B的形状。

除了这个难题,我想知道你是否真的需要连接。您可以初始化B[idx, 0, ...] = a B[idx, 1, ...] = b etc ,以便直接分配值,例如

{{1}}

填充后重塑数组很简单。即使转置轴也不会太费时间。