Python 多处理:锁定适合(大)磁盘写入吗?
Python Multiprocessing: is locking appropriate for (large) disk writes?
我有多处理代码,其中每个进程都进行磁盘写入(pickling 数据),生成的 pickle 文件可能超过 50 MB(有时甚至超过 1 GB,具体取决于我在做什么)。另外,不同的进程不会写入同一个文件,每个进程写入一个单独的文件(或一组文件)。
围绕磁盘写入实施锁定以便一次只有一个进程写入磁盘是否是个好主意?或者即使这意味着 4 个进程可能试图同时将 1 GB 写入磁盘,最好还是让操作系统对其进行排序?
只要进程不争夺同一个文件;让 OS 解决。这是它的工作。
除非您的进程尝试在一次大写入中转储它们的数据,否则 OS 可以更好地安排磁盘写入。
如果你确实使用了一个大写,你可能会尝试将它分成更小的块。这可能会给 OS 一个更好的机会来处理它们。
当然你会在某处达到极限。您的程序可能是 CPU-bound、内存-bound 或磁盘-bound。它可能会达到不同的限制,具体取决于输入或负载。
但是除非你有证据你经常磁盘绑定和你有一个好主意如何解决这个问题,我会说不要打扰。因为 write
系统调用实际上意味着数据被直接发送到磁盘的日子已经一去不复返了。
现在大多数操作系统都使用未分配的 RAM 作为磁盘缓存。 HDD 也有内置缓存。除非你同时禁用这两个(这会给你带来 巨大的 性能损失),否则你的程序完成 write
和实际击中盘子或闪光灯的数据。
您可以考虑使用 memmap
(如果您的 OS 支持),让 OS 的虚拟内存为您完成工作。参见例如architect notes for the Varnish cache.
我有多处理代码,其中每个进程都进行磁盘写入(pickling 数据),生成的 pickle 文件可能超过 50 MB(有时甚至超过 1 GB,具体取决于我在做什么)。另外,不同的进程不会写入同一个文件,每个进程写入一个单独的文件(或一组文件)。
围绕磁盘写入实施锁定以便一次只有一个进程写入磁盘是否是个好主意?或者即使这意味着 4 个进程可能试图同时将 1 GB 写入磁盘,最好还是让操作系统对其进行排序?
只要进程不争夺同一个文件;让 OS 解决。这是它的工作。
除非您的进程尝试在一次大写入中转储它们的数据,否则 OS 可以更好地安排磁盘写入。 如果你确实使用了一个大写,你可能会尝试将它分成更小的块。这可能会给 OS 一个更好的机会来处理它们。
当然你会在某处达到极限。您的程序可能是 CPU-bound、内存-bound 或磁盘-bound。它可能会达到不同的限制,具体取决于输入或负载。
但是除非你有证据你经常磁盘绑定和你有一个好主意如何解决这个问题,我会说不要打扰。因为 write
系统调用实际上意味着数据被直接发送到磁盘的日子已经一去不复返了。
现在大多数操作系统都使用未分配的 RAM 作为磁盘缓存。 HDD 也有内置缓存。除非你同时禁用这两个(这会给你带来 巨大的 性能损失),否则你的程序完成 write
和实际击中盘子或闪光灯的数据。
您可以考虑使用 memmap
(如果您的 OS 支持),让 OS 的虚拟内存为您完成工作。参见例如architect notes for the Varnish cache.