我想通过处理数据集 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。
答案 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}}
填充后重塑数组很简单。即使转置轴也不会太费时间。