mmapping位于ramdisk上的numpy数组所带来的开销是多少?

时间:2017-06-16 18:16:55

标签: linux numpy multiprocessing fork shared-memory

我遇到类似这个问题的情况:

Share Large, Read-Only Numpy Array Between Multiprocessing Processes

除了一个显着的区别,我绝对希望整个阵列都能存在于RAM中。为了清楚起见,重申:

我想在多个进程之间共享一个相当大的numpy数组,只读,并将整个数组保存在RAM中以获得绝对最佳的性能。只有linux的解决方案很好。我也喜欢在生产环境中工作,所以宁愿避免依赖于面向研究的软件包,也不要做任何hacky。

对于这种情况,在我看来,numpy-sharedmem风格的方法是过度的。仍然脱颖而出的方法是:

  1. 在另一个帖子here中建议,将数组保存为全局变量,只需fork()。这似乎会尽可能快。多个进程最终会以任何方式在共享内存页面上竞争,或以某种方式干扰彼此的缓存,这会引入一些开销而不是单进程方案?

    虽然由于this one之类的评论,但我对这种方法很谨慎。在我的多处理环境中尝试使用fork()也可能不方便(此时我最有可能使用Twisted)。

  2. 虽然numpy的内置内存映射was在另一个线程中出现,但它显然面向比主内存更大的数组。我不相信我已经在stackoverflow上讨论了以下可能性:为什么不将npy文件放入ramdisk并mmap(mmap_mode='r')以便在内存中轻松稳定地进行只读共享numpy数组?

    这里有哪些性能考虑因素?它与fork()方法或真正的共享内存方法(例如numpy-sharedmem)有很大不同吗? numpy中的mmap图层会产生多少开销?当npy文件放在ramdisk上时,连续性是否很重要?缓存位置是否受影响?进程之间是否存在争用?

  3. 我倾向于选择2仅用于稳定性因素,但是想了解可能存在的性能差异,并且理解为什么mmap + ramdisk对于许多与我类似或不太相似的应用程序来说可能是一种快速简便的解决方案。

1 个答案:

答案 0 :(得分:0)

使用ramdisk会涉及访问文件系统所涉及的所有开销,在ramdisk和页面缓存之间复制数据,复制数据。

如果使用ramfs,则不会有访问数据的开销,这些数据将被锁定在RAM中。但是,这意味着其他数据将无法保存在RAM中,可能会降低大修性能。

使用tmpfs具有与匿名内存类似的性能。