我正在解析大约8 GB,自然地,我想尽可能地优化内存和处理器使用率。我一次将一个文件读入缓冲区1页(4096字节),它在大约30分钟(比python快几个小时)中读取整个内容,但我想做得更好。我认为多线程是实现这一目标的方法,但我不知道如何在C语言中实现。我所看到的示例令人印象深刻,但过于复杂。我希望有人可以弄清楚使用C的多线程功能的基本组件是什么,并让我对即将遇到的任何并发问题有所了解。感谢您提供任何帮助。
要澄清的是,我正在寻找的是非常基本的东西,例如创建2个线程,每个线程打个四倍打个招呼世界。
想象一下,我有4个线程搜索81920字节(20页)。
线程1:搜索页面1 线程2:搜索页面2 线程3:搜索页面3 线程4:搜索页面4 ---假设它们按顺序完成--- 线程1:搜索页面5 线程2:搜索页面6 线程3:搜索第7页 线程4:搜索第8页 ---假设它们按顺序完成--- 线程1:搜索第9页 线程2:搜索第10页 线程3:搜索第11页 线程4:搜索第12页 ---假设它们完成按顺序--- 线程1:搜索第13页 线程2:搜索第14页 线程3:搜索第15页 线程4:搜索第16页 ---假设它们按顺序完成--- 线程1:搜索第17页 线程2:搜索第18页 线程3:搜索第19页 线程4:搜索第20页
之所以如此重要的原因是因为对于81920个字节中的每个字节(实际上,我们希望再增加5个0,我将wcscpy称为5x
我想我已经找到了我想要的东西:这里的第二个例子是关于我想要的复杂程度。我想这样做,谢谢。
将文件映射到内存。有关如何执行此操作的详细信息,请参见MSDN示例“在文件内创建视图”。您的用例有所不同,但是原理是相同的,最终您将使用相同的Windows函数。(如果您使用的是64位进程,则可以将整个文件映射到内存中;否则,您需要将其映射为大块,并处理匹配跨越多个大块的情况。)
您可以CreateThread
用来创建多个线程来分块处理数据。
我正在读取一个8 GB的二进制文件,并搜索所有5个特定的文件
wchar_t*
如果这就是您要做的全部工作,那么此工作负载几乎肯定会受到I / O约束,并且多个线程可能会也可能不会帮助您。可以通过对所讨论的数据进行一次遍历来完成这种子字符串搜索,例如,对于单个模式使用Knuth-Morris-Pratt,对于多个模式使用Aho-Corasick。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句