我正在编写一个多线程应用程序,截至目前我有这个想法。我有一个FILE*[n]
,其中n
是在运行时确定的数字。我打开所有n个文件进行读取,然后多个线程可以访问以读取它。对每个文件的数据进行计算是等效的,即如果假定串行执行,则每个文件将在内存中保留相同的时间。
每个文件都可以任意大,所以不应该假设它们可以加载到内存中。
现在在这种情况下,我希望减少发生的磁盘IO数量。如果有人能为这种情况建议任何共享内存模型会很棒(我不知道我是否正在使用它,因为我对如何实现的方式知之甚少。)我不知道应该如何实现这一点。换句话说,我只想知道实现这种情况的最有效模型是什么。我正在使用C
。
编辑:一个更详细的场景。
实际问题是我对n个文件中包含的数据有n个bloom过滤器,并且一旦文件中的所有元素都插入到相应的bloom过滤器中,我需要进行成员资格测试。由于成员资格测试是对数据文件的只读过程,因此我可以从多个线程读取文件,并且可以轻松地并行化此问题。现在有数据的文件数量相当大(大约20k并注意文件数等于布隆过滤器的数量)所以我选择产生一个线程用于测试针对bloom-filter,即每个bloom过滤器都有自己的线程,将逐个读取每个其他文件,并针对布隆过滤器测试数据的成员资格。在这种情况下,我想尽量减少磁盘IO。
答案 0 :(得分:3)
一开始使用mmap()函数将文件映射到内存中,而不是打开/读取FILE *。之后产生读取文件的线程。 通过这种方式,操作系统可以缓存内存中的访问,只在缓存变满时执行磁盘操作。
答案 1 :(得分:0)
如果您的程序是多线程的,除非您采取措施创建线程本地存储,否则所有线程都在共享内存。您不需要直接使用o / s共享内存。最小化I / O的方法是确保每个文件尽可能只读一次,同样结果文件只写一次。
你如何做到这取决于你正在进行的处理。
f每个线程负责完整处理文件,然后线程只读取文件;你不能再减少I / O.如果一个文件必须由多个线程读取,那么您应该尝试对该文件进行内存映射,以使其可供所有相关线程使用。如果您使用的是32位程序且文件太大而无法完全适合内存,则无法进行内存映射。然后,您需要确定不同线程将如何处理每个文件,并尝试最小化不同线程重新读取文件的次数。如果您使用的是64位程序,则可能有足够的虚拟内存来通过内存映射I / O处理所有文件。您仍希望将访问数据的次数保持在最低限度。类似的概念适用于输出文件。