1

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

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

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

编辑:更详细的场景。

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

4

2 回答 2

3

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

于 2012-06-25T23:39:37.903 回答
0

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

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

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

于 2012-06-25T23:44:11.257 回答