【问题标题】:Reduce number of disk access while writing to file in C在 C 中写入文件时减少磁盘访问次数
【发布时间】:2012-06-27 06:25:49
【问题描述】:

我正在编写一个多线程应用程序,到目前为止我有这个想法。我有一个FILE*[n],其中n 是在运行时确定的数字。我打开所有 n 个文件进行读取,然后多个线程可以访问读取它。每个文件数据的计算是等价的,即如果假设串行执行,那么每个文件将同时保留在内存中。

每个文件都可以任意大等等不应该假设它们可以加载到内存中。

现在在这种情况下,我想减少发生的磁盘 IO 数量。如果有人可以为这种情况建议任何共享内存模型,那就太好了(我不知道我是否正在使用一个,因为我对事物的实现方式知之甚少)。我不确定我应该如何实现这一点。换句话说,我只想知道实现这种场景的最有效模型是什么。我正在使用C

编辑:更详细的场景。

实际的问题是我对 n 个文件中包含的数据有 n 个布隆过滤器,一旦文件中的所有元素都插入到相应的布隆过滤器中,我就需要进行成员资格测试。由于成员资格测试是数据文件的只读过程,因此我可以从多个线程读取文件,并且可以轻松并行化此问题。现在有数据的文件数量相当大(大约 20k 并且注意文件数量等于布隆过滤器的数量)所以我选择生成一个线程来测试布隆过滤器,即每个布隆过滤器都有自己的线程并且将一个一个地读取所有其他文件,并根据布隆过滤器测试数据的成员资格。在这种情况下,我想尽量减少磁盘 IO。

【问题讨论】:

  • 你说的是什么平台?如果您在 Linux 上,最简单的方法是将它们作为内存映射文件打开,并让操作系统处理它。 (我相信 Windows 也有类似的。)
  • 我在 linux 上。你能解释一下吗,拜托
  • 不确定您要通过共享内存共享什么?如果您正在考虑内存映射文件,那不一定会减少 IO(您仍然必须阅读所有必须阅读的内容)。为什么你认为 IO 是个问题?我认为这里没有足够的细节来提供有意义的建议... 我注意到您的问题标题提到了编写文件,但没有提及文件在正文中的写入方式/位置
  • 使用内存映射文件,您可以让操作系统虚拟内存系统处理一种有效的方法来将文件分页进出物理内存,同时考虑来自不同线程/进程的多次访问。

标签: c performance io disk-access


【解决方案1】:

在开始时使用 mmap() 函数将文件映射到内存中,而不是打开/读取 FILE*。之后产生读取文件的线程。 这样,操作系统会缓冲内存中的访问,只有在缓存变满时才执行磁盘 io。

【讨论】:

    【解决方案2】:

    如果您的程序是多线程的,则所有线程都共享内存,除非您采取措施创建线程本地存储。您不需要直接使用 o/s 共享内存。最小化 I/O 的方法是确保每个文件尽可能只读取一次,类似地,结果文件每个只写入一次。

    您如何做到这一点取决于您正在进行的处理。

    f 每个线程负责完整地处理一个文件,然后线程简单地读取该文件;你不能再减少 I/O 了。如果一个文件必须由多个线程读取,那么您应该尝试对该文件进行内存映射,以便所有相关线程都可以使用它。如果您使用的是 32 位程序并且文件太大而无法全部放入内存中,则不一定可以进行内存映射。然后你需要弄清楚不同线程将如何处理每个文件,并尽量减少不同线程必须重新读取文件的次数。如果您使用的是 64 位程序,您可能有足够的虚拟内存来通过内存映射 I/O 处理所有文件。您仍然希望将访问数据的次数保持在最低限度。类似的概念适用于输出文件。

    【讨论】:

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