【发布时间】: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