通过映射位于ramdisk上的numpy数组强加的开销是多少?

问题描述:

我也有类似的对这个问题的情况:通过映射位于ramdisk上的numpy数组强加的开销是多少?

Share Large, Read-Only Numpy Array Between Multiprocessing Processes

除此之外,我肯定想整个数组住在RAM一个显著的差异。为了清晰起见,需要重申:

我想在多个进程之间共享一个相当大的numpy数组,只读,并将整个数组保存在RAM中以获得绝对最佳性能。只有linux的解决方案很好。我也希望在生产环境中工作,所以宁愿避免将依赖项放在研究型软件包上,或者做任何事情。

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

  1. 在其他线程here建议,将阵列保持为一个全局变量,只是fork()。这似乎会尽可能快。多个进程最终会以任何方式在共享内存页面上进行竞争,或者以某种方式干扰对方的缓存,从而导致一些开销而不是单进程方案?

    虽然由于像this one这样的评论,我仍然对这种方法持怀疑态度。在我的多处理环境中尝试使用fork()也可能不方便(我很可能在此时使用Twisted)。

  2. 虽然numpy的内置内存映射was在另一个线程中出现,但它明显面向比主内存大的数组。我不相信我已经看到在*上讨论以下可能性:为什么不把npy文件放到一个ramdisk中并将它映射(mmap_mode='r')以获得简单而稳定的只读内存共享numpy数组?

    这里的性能考虑是什么?与fork()方法有很大不同,还是像numpy-sharedmem这样的真正的共享内存方法? numpy中的mmap图层会产生多少开销?当npy文件放在ramdisk上时,连续性是否重要?缓存区域是否受到影响?进程之间会有争用吗?

我倾向于选择2单独的稳定因素,但想了解可能的性能差异,并理解为什么MMAP +虚拟盘可能是许多应用类似的或不那么快速和简单的解决方案类似于我的。

+0

Linux上的共享内存已经作为mmp在tmpfs上实现,所以没关系。 –

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

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

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