【发布时间】:2019-11-15 02:30:11
【问题描述】:
我有一个非常大的 numpy 数组,大小为 [256,256,256,256],它占用了大约 8GB 的内存。
我想使用 multiprocessing 快速处理数据,类似于基于 tile 的渲染软件(例如 blender)使用的方法。
我想将我的数据分成更小的块,为它们创建一个进程列表,当一个完成后,开始处理下一个。我当前的方法使用 V 拆分,然后循环执行 hsplit 并获取块。下面是一个小得多的数据集的代码示例(9 x 9 分为 3 x 3 块):
import numpy as np
data = np.array(np.arange(0,81)).reshape((9,9))
print(data.shape)
print(data)
print("#"*30)
data = np.array([np.vsplit(set,3) for set in np.hsplit(data,3)])
print(data.shape)
print(data)
print("#"*30)
这并不完全符合我的要求,它创建了 9 个 3 x 3 的块,但这是一个小问题。主要问题是我不认为通过这样的数组循环来应用 vsplit 非常有效,但我不知道有一个内置函数可以自动执行此操作而无需循环。
我尝试使用 map 来查看它是否以更有效的方式自动应用 vsplit,但计时结果非常相似,所以我认为不是这样。有关如何优化此问题的任何建议?
【问题讨论】:
-
你可能想看看numexpr AFAIK 实现的东西与你的策略非常相似。
-
@Paul Panzer 我仍然看不出它如何帮助将数组分成更小的块。这就是我大部分性能提升的来源。能够充分利用所有 CPU 内核比对处理算法本身的小幅改进重要得多。
-
"NumExpr 将表达式解析为它自己的操作码,然后由集成计算虚拟机使用。数组操作数被分成小块,很容易放入 CPU 的缓存中,并且传递给虚拟机。然后虚拟机对每个块应用操作。值得注意的是,表达式中的所有临时变量和常量也是块化的。块分布在 CPU 的可用内核中,从而实现高度并行的代码执行。 " 这和你尝试的不一样?
标签: python arrays numpy indexing