假设我们有两个相同数据类型和形状的大型numpy数组,大小约为GB级别。将所有值从一个复制到另一个的最快方法是什么?
当我使用正常符号进行此操作时,例如
我并不建议在这个问题上使用
是否存在一种python接口,可以使用一些多线程C / C ++
更新(2017年5月3日)
如果可能,使用多个python进程移动数据可以大大提高速度。我有一个场景,其中我已经有几个小的共享内存缓冲区被工作进程写入。每当一个填满时,主进程会收集这些数据并将其复制到主缓冲区中。但是,只有选择主缓冲区中的位置,并分配一个记录工作进程来实际执行复制(从大量待命的记录进程中),才能更快地完成。在我的特定计算机上,可以通过并发工作进程在很短的时间内移动几GB,而单个进程需要几秒钟。
尽管如此,这种设置并不总是(甚至通常不是)可能的,因此最好有一个单个python进程能够进入多线程memcpy例程...
当我使用正常符号进行此操作时,例如
A[:] = B
,我会看到计算机上的一个核心在几秒钟内以最大的努力进行复制,而其他核心则处于空闲状态。 当我使用multiprocessing
启动多个工作进程,并让它们每个人将不同的切片复制到目标数组中,以便复制所有数据时,使用多个工作进程会更快。无论目标数组是共享内存数组还是成为工作进程的本地数组,这都是正确的。在具有多个核心的机器上,在一些测试中,我可以获得5-10倍的加速。随着我添加更多的工作进程,速度最终会平稳下来,甚至会变慢,因此我认为这达到了内存性能限制。我并不建议在这个问题上使用
multiprocessing
;它只是为了证明更好的硬件利用可能性。是否存在一种python接口,可以使用一些多线程C / C ++
memcpy
工具?更新(2017年5月3日)
如果可能,使用多个python进程移动数据可以大大提高速度。我有一个场景,其中我已经有几个小的共享内存缓冲区被工作进程写入。每当一个填满时,主进程会收集这些数据并将其复制到主缓冲区中。但是,只有选择主缓冲区中的位置,并分配一个记录工作进程来实际执行复制(从大量待命的记录进程中),才能更快地完成。在我的特定计算机上,可以通过并发工作进程在很短的时间内移动几GB,而单个进程需要几秒钟。
尽管如此,这种设置并不总是(甚至通常不是)可能的,因此最好有一个单个python进程能够进入多线程memcpy例程...
memcpy
的C库,如果请求的大小足够大,则可能是并发的,这是非常简单的,然后您可以通过ctypes简单地调用它。但是再次强调,一个良好编写的memcpy甚至在不涉及多线程的情况下也可以饱和内存。 - Matteo Italia