如何用好流水线思路来并行读和处理

C++实现大文件并行计算md5方案
博客提出对约10000w行的巨大文件每行字节并行计算md5并保存不重复md5的问题,给出用流水线实现并行读与处理的方案。使用C++代码,建立两个缓冲vector,通过指针翻转实现并行,新建线程处理数据,还提及线程回收及收尾处理。

今天我们来提个问题:

 

有一个巨大的文件(约10000w行),现在需要对于每一行的字节并行计算md5. 最后保存所有不重复的md5. 小伙伴们有什么好思路吗?要求要快,硬件确定条件下,运行时间最小方案~

 

我想到了一个方案就是用流水线。

这样就可以并行读与处理了。

 

代码用C++写的,建立两个缓冲 vector, 然后读到其中一个,读满后开启处理,之后翻转vector,为了避免不必要的深度COPY,这里就只是翻转指针。

 

指针翻转后,主线程依旧保持读操作,而原来的满Vector被放入了处理流水线中进行处理。这里的处理很简单,用了一个延时来模拟处理。

由于处理流水不能拖累了主线程,所以新建了一个线程来做这些处理。

 

线程建了之后,应该怎样回收线程?这里要避免首次。因为首次是空的vector, 所以需要在线程可以 joinable() 时进行回收线程。

 

还有一个要注意的地方是最后有两个尾巴需要收拾。

一个是有一个线程没有回收,还有一个尾vector可能因为没能填充满vector, 所以没有被丢进线程,也需要单独处理一下。

 

说了这么多, talk is cheap, show me the code.

 

废话少说了,完整的 C++ 代码如图:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值