【问题标题】:Multiple buffers on the same file同一文件上的多个缓冲区
【发布时间】:2022-07-15 13:38:30
【问题描述】:

过程如下。

  1. 通过C中的文件流逐行过滤一个巨大的File.txt文件(如果您有兴趣,可以使用fastq文件)。

  2. 每次过滤后,输出为filtered_i.txt文件。

  3. 使用 1000 个不同的过滤器重复步骤 1-2。

  4. 预期结果是 1000 个filtered_i.txt 文件,i 从 1 到 1000。

问题是:

我可以并行运行这些过滤过程吗?

我担心如果并行处理会在File.txt 中打开多个缓冲区。这样做安全吗?有什么潜在的缺点吗?

【问题讨论】:

  • "将在 File.txt 中打开多个缓冲区"。目前尚不清楚这意味着什么。请显示minimal reproducible example 以说明其所指的内容。但一般来说,同一个文件有多个阅读器是可以的。
  • @kaylum,感谢您的提醒。稍后我将尝试添加一个最小的示例以确保完整性。另外,也感谢您对readers 的提示。

标签: c filestream file-storage


【解决方案1】:

我建议不要同时打开一个文件多次。这给操作系统带来了很大的压力,如果你的所有线程都在一次流式传输,你的性能会因为抖动而显着下降。连续流式传输文件会更好,即使是大文件。如果您确实想要一个并行解决方案,我建议让一个线程成为“流媒体”,您可以从文件中读取一定数量的块,然后将这些块传递给其他线程。

【讨论】:

  • 我现在明白你的痛点(以前不知道这个词),这正是我担心的地方。当您说streamer 时,您是指将某些行开销读入堆中吗?如果是这样,您对“流媒体”的大小有什么建议吗?流媒体一般会提高还是降低性能?
  • @yuw444 是的,这正是我的意思。至于推荐的“堆大小”,我没有任何具体值,但我的建议是调整它的大小,以便尽可能少地读取。阅读本身并不昂贵,但如果你要打一堆电话,它可能会变得很贵。
  • 但是等等,我刚刚意识到即使使用streamer,使用fgets() 的时间也不会改变。我在这里有什么遗漏吗?
  • @yuw444 也许我误解了你所说的“文件流”的意思,但是关于fgets,如果你用更大的缓冲区大小调用它,那么你将减少调用次数到fgets。在任何情况下,您都应该只有一个线程调用fgets,因为文件指针不会跨线程共享,您最终会遇到一些奇怪的行为。
  • 即使你只有一个线程从文件中读取,你仍然有 1000 个过滤器。即使你并行执行 8 个,你仍然有文件的不同部分在内存中飞来飞去,所以你仍然会像他们都打开文件并直接从 FS 读取(通过操作系统的 FS 缓存,我假设)。
【解决方案2】:

在任何健全的操作系统(包括所有大型操作系统)中,不同进程或同一进程的不同线程并行打开同一个文件进行读取是可能且安全的。

操作系统也会缓存文件并执行预读,因此如果两个线程/进程从同一个文件读取,第一个将从磁盘读取,操作系统将缓存它,第二个将从缓存读取。

您应该担心的主要事情是将并行度级别与机器的能力(处理器数量,内存大小)和过滤器的要求(过滤线程是 I/O 绑定还是 CPU 绑定,如何它们消耗的内存等等)。

请注意,过滤器使用的内存与操作系统缓存用于缓存文件的内存相同,因此如果您为过滤器占用过多内存,您将在操作系统刷新缓存文件时遇到一种抖动然后每次都重新加载。

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多