2012-06-25 65 views
1

我正在编写一个多线程应用程序,截至目前,我有这个想法。我有一个FILE*[n],其中n是一个在运行时确定的数字。我打开所有n个文件进行读取,然后多个线程可以访问并读取它。每个文件的数据计算是等效的,即如果假设串行执行,则每个文件将同时保留在存储器中。在写入文件时减少磁盘访问次数C

每个文件都可以是任意大的,所以不应该认为它们可以加载到内存中。

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

编辑:更详细的情况。

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

+0

你在说什么平台?如果你在Linux上,最简单的方法是将它们作为内存映射文件打开,并让操作系统处理它。 (我敢肯定,Windows有相同的功能。) –

+0

我在linux上。你能解释一下吗,请 –

+0

不确定你试图通过共享内存分享?如果你正在考虑内存映射文件,那不会严重减少IO(你仍然必须阅读所有你必须阅读的东西)。为什么你认为IO是一个问题?我认为这里没有足够的细节来给出有意义的建议......我注意到您的问题标题提到了写入文件,但是没有提及如何/在哪里将文件写入正文 John3136

回答

3

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

0

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

你是如何做到这一点取决于你正在做的处理。 f每个线程负责整个处理一个文件,然后该线程简单地读取该文件;你不能再减少I/O。如果一个文件必须被多个线程读取,那么你应该尝试对内存进行映射,以便它可以被所有相关的线程使用。如果您使用的是32位程序,并且这些文件太大而不适合内存,则无法进行内存映射。然后你需要计算出不同的线程将如何处理每个文件,并尽量减少不同线程重新读取文件的次数。如果您使用的是64位程序,则可能有足够的虚拟内存通过内存映射I/O处理所有文件。您仍然希望将访问数据的次数降到最低。类似的概念适用于输出文件。