怎样才能多线程用于有效读取文件[按块读取]?或任何提高读取速度的方法。
我一直在尝试实际的结果,这是一个多线程的好东西,不像我以前的建议。非线程变量运行在1m44,711s,4线程(在4个内核上)运行在0m31,559s,而8线程(在4个内核+ HT上)运行在0m23,435s。主要改进 - 几乎是加速的5倍。
那么,你如何分担工作量?将它拆分为N个块(n ==线程数),并且除了首先寻找第一个非单词字符之外的每个线程。这是他们的逻辑块的开始。他们的逻辑块结束于它们的结束边界,在该点之后被取整为第一个非单词字符。
并行处理这些块,将它们全部同步到一个线程,然后使该线程执行结果合并。
为了提高阅读速度,你可以做的最好的下一件事是确保你尽可能不复制数据。通过内存映射文件读取并通过将指针或索引保存到开始和结束来查找字符串,而不是累积字节。
有没有比地图更好的数据结构可以用来有效地找到输出?
嗯,因为我不认为你会使用该命令,unordered_map是一个更好的选择。我也将它作为unordered_map<std::string_view, size_t>
- string_view将其复制到比字符串更小的位置。
在剖析中,我发现53%的时间花在寻找包含给定单词的确切桶上。
不是'std :: string_view' C++ 17? –
'std :: string_view'是C++ 17。你也可以使用boost :: string_view,或者使用命中和复制。 – dascandy