文件写入顺序对将来的顺序读取有多大影响?

How much does file write order matter for future sequential reading?

提问人:Kdesert 提问时间:2/12/2023 最后编辑:OneCricketeerKdesert 更新时间:2/12/2023 访问量:40

问:

我正在预处理大量原始文件,以便将来进行分析,并按顺序读回它们。原始文件位于网络文件服务器上,处理后的文件将写入本地外部 USB 驱动器(12TB HDD,带 4k 群集的 ReFS)。处理的文件每个为 ~100 KB,我预计每年会按文件名排序访问它们几次。有 60+ 百万个文件.....

我的一般问题涉及预处理文件以与读取相同的顺序写入有多重要?详情如下...

Python 的多处理模块用于预处理,以最大限度地提高 I/O 和 CPU。我在 os.walk 中有一个循环,它列出了文件服务器中的 N=1000 个文件,然后将该列表传递给 Pool.map(),后者将工作映射到一个函数,该函数逐个处理文件并将它们写入 USB 驱动器。从性能的角度来看,这似乎运作良好。但是,我注意到文件没有以完美的顺序进行处理和写入,我认为这是因为池不协调。它相当接近,但并不准确。下面是一个虚构的示例(假设这些是文件名),按它们写入 USB 驱动器的顺序列出:

1 4 2 3 6 5 9 11 7 10 8 12 17 21

将来,我将以小批量的“相邻文件名”(N = 16 或 32)读取这些内容,如下所示: (1,2, 3,...14,15,16). 所有文件都将按顺序读取,但它们是批量处理的(将它们输入神经网络)。我假设这个读取将是单步的,所以它实际上是一次从操作系统请求一个文件,尽管我最终可能会依赖 TensorFlow 或 PyTorch 中的数据加载器,它可以并行进行多次读取......我仍在学习那部分,不确定它将如何工作。但要点是文件将根据其文件名按顺序读取。

我的问题是:

  1. 以与读取文件完全相同的顺序编写文件有多重要?即使文件是以近似的文件名顺序写入的,以至于给定的“读取批处理”中的大多数文件在磁盘盘片上“靠得很近”,我是否会导致磁盘抖动过多?我担心性能下降和驱动器故障风险增加。

  2. 如果我确实想解决这个问题,我会怎么做?我未经测试的菜鸟想法如下:

    1. 让池将处理后的文件作为内存中对象返回,然后使用单步执行代码将它们写入磁盘。这将消耗更多的内存,迫使我减少池的数量和/或深度,从而导致更大的开销。(我认为单线程写作不会成为瓶颈)

      1. 也许这个单线程写入活动可以在 os.walk 旁边并行化?它们会占用不同的 I/O 通道,而且 CPU 也不会占用大量资源。
    2. 我的第二个想法是以某种方式协调池,让它们按顺序写入文件,但我不确定如何做到这一点,或者这是否可能或可取。

    3. 第三个想法是让池将文件写入系统的 SSD 而不是 USB 驱动器,然后定期使用单步代码以所需的顺序将它们移动到外部 USB 驱动器。从本质上讲,将 SSD 视为一个大缓冲区。

无论如何,如果有人对如何处理这个问题有任何想法,我很想听听他们的意见!

Python 性能 IO 存储

评论

0赞 OneCricketeer 2/12/2023
不清楚为什么秩序在这里真的很重要。最终,根据数据,我建议使用数据库,而不是原始文件解析。或者,您不能将较小的文件压缩成更大的批次以减少 io 吗?
0赞 Kdesert 2/12/2023
我不知道顺序有多重要,但似乎会吗?这些文件本质上是存储为 jpeg 文件(在点旁边)的单个视频帧,需要按顺序读取以进行分析。我将使用 TensorFlow 或 PyTorch 来分析它们,这些库接受小批量的图像。Gzip是个好主意,我会研究的。在以后分析数据时,这会增加一些开销并降低灵活性,但也许值得权衡。

答: 暂无答案