今天我们来提个问题:
有一个巨大的文件(约10000w行),现在需要对于每一行的字节并行计算md5. 最后保存所有不重复的md5. 小伙伴们有什么好思路吗?要求要快,硬件确定条件下,运行时间最小方案~
我想到了一个方案就是用流水线。
这样就可以并行读与处理了。
代码用C++写的,建立两个缓冲 vector, 然后读到其中一个,读满后开启处理,之后翻转vector,为了避免不必要的深度COPY,这里就只是翻转指针。
指针翻转后,主线程依旧保持读操作,而原来的满Vector被放入了处理流水线中进行处理。这里的处理很简单,用了一个延时来模拟处理。
由于处理流水不能拖累了主线程,所以新建了一个线程来做这些处理。
线程建了之后,应该怎样回收线程?这里要避免首次。因为首次是空的vector, 所以需要在线程可以 joinable() 时进行回收线程。
还有一个要注意的地方是最后有两个尾巴需要收拾。
一个是有一个线程没有回收,还有一个尾vector可能因为没能填充满vector, 所以没有被丢进线程,也需要单独处理一下。
说了这么多, talk is cheap, show me the code.
废话少说了,完整的 C++ 代码如图: