Visual C多线程文件读取

时间:2015-07-06 03:55:36

标签: c multithreading visual-c++ binaryfiles

我正在解析大约8 GB,当然我想尽可能地优化我的内存和处理器使用。我一次将文件读入缓冲区1页(4096字节),它在大约30分钟内读取整个内容(比python快几个小时),但我想让它变得更好。我认为多线程是实现这一目标的方法,但我不知道如何在C中进行。我见过的样本令人印象深刻,但过于复杂。我希望有人能够了解使用C的多线程功能的基本组件是什么,并让我了解我将遇到的任何并发问题。感谢您提供的任何帮助。

澄清一下,我正在寻找的是非常基本的东西,例如创建2个线程,例如每个打印hello world 4次。

想象我有4个线程搜索81920字节(20页)。

thread 1: searches page 1
thread 2: searches page 2
thread 3: searches page 3
thread 4: searches page 4
---assume they finish in order---
thread 1: searches page 5
thread 2: searches page 6
thread 3: searches page 7
thread 4: searches page 8
---assume they finish in order---
thread 1: searches page 9
thread 2: searches page 10
thread 3: searches page 11
thread 4: searches page 12
---assume they finish in order---
thread 1: searches page 13
thread 2: searches page 14
thread 3: searches page 15
thread 4: searches page 16
---assume they finish in order---
thread 1: searches page 17
thread 2: searches page 18
thread 3: searches page 19
thread 4: searches page 20

这是如此重要的原因是因为对于81920字节中的每个字节(实际上我们想要增加大约5个0,我调用wcscpy高达5x

我想我找到了我正在寻找的东西:here第二个例子是关于我正在寻找的复杂程度。我认为这是非常感谢。

1 个答案:

答案 0 :(得分:0)

将文件映射到内存中。有关如何执行此操作的详细信息,请参阅MSDN示例"Creating a View Within a File"。您的用例有点不同,但原理是相同的,您最终将使用相同的Windows功能。 (如果您使用的是64位进程,则可以将整个文件映射到内存中;否则您需要将其映射到块中并处理匹配跨越多个块的情况。)

您可以使用CreateThread创建多个线程来处理数据块。

  

我正在读取一个8 GB的二进制文件,并搜索所有出现的5个特定wchar_t*

如果这就是您所做的一切,那么这个工作负载几乎肯定会受到I / O限制,并且多个线程可能会或可能不会帮助您。可以使用对相关数据的单次传递来完成此类型的子字符串搜索,例如,Knuth-Morris-Pratt用于单个模式,或Aho-Corasick用于多个模式。