我正在解析大约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第二个例子是关于我正在寻找的复杂程度。我认为这是非常感谢。
答案 0 :(得分:0)
将文件映射到内存中。有关如何执行此操作的详细信息,请参阅MSDN示例"Creating a View Within a File"。您的用例有点不同,但原理是相同的,您最终将使用相同的Windows功能。 (如果您使用的是64位进程,则可以将整个文件映射到内存中;否则您需要将其映射到块中并处理匹配跨越多个块的情况。)
您可以使用CreateThread
创建多个线程来处理数据块。
我正在读取一个8 GB的二进制文件,并搜索所有出现的5个特定
wchar_t*
如果这就是您所做的一切,那么这个工作负载几乎肯定会受到I / O限制,并且多个线程可能会或可能不会帮助您。可以使用对相关数据的单次传递来完成此类型的子字符串搜索,例如,Knuth-Morris-Pratt用于单个模式,或Aho-Corasick用于多个模式。