利用多线程技术优化文件读写转换处理

在电信系统CDR处理中,有大量的原始话单数据需要被读取、转换后再写入新的文件。如果使用C语言实现,一个复杂的读写转换处理过程可以分为以下几步:

 

  1. 从源文件中读取一块数据
  2. 建立相应的数据结构并将读取的数据,以及定义源文件数据格式的配置文件,一并映射到该结构中,如果是线性的数据结构,例如NSN默认的CDR文件,一般采用单向链表,如果是非线性的数据结构,例如Ericsson默认的CDR文件,一般采用二叉树,如果需要进行排序,最好还要采用双向链表
  3. 把上述数据结构编码转换后,输出到字符串数组
  4. 把上述字符串写入到目标文件
  5. 销毁使用过的数据结构,由于C没有Java的垃圾回收机制,动态分配的内存空间必须及时回收
  6. 循环1-5直至源文件的所有块数据处理完毕

 

众所周知,独立的计算机系统的瓶颈一般在于IO,而且写入操作比读取操作耗费的时间多很多。即使是一个非常复杂的文件处理,上述第4步的耗时应该与其它几步的总耗时相当,甚至还要超出。这就意味着,单线程执行下,程序在进行第4步处理的时候,其它几步必须进行等待,但有些等待其实是没有必要的。仔细分析,与第4步处理存在资源共享关系的只有第3步,它们会共享一个字符串数组,而其它第125步,与之没有关系。因此,在写入目标文件的同时,销毁数据结构、读取下一块数据,以及建立该新块的数据结构,是完全可以在另一个线程执行的,从而达到优化的目的。

 

多线程优化的思路:主线程负责源文件的读取、数据结构的建立、数据结构到字符串数组的输出,以及数据结构的销毁,副线程只负责字符串数组写入到目标文件。两个线程之间的同步关键在于字符串数组的控制权:主线程输出到字符串数组完毕,副线程才能开始工作,副线程写入目标文件完毕,主线程才能将下一块的数据结构输出到该字符串数组。

 

于是,具体实现上,需要设置两个信号灯,一个是read_ok,表示主线程的读取转换操作完毕,副线程可工作,另一个是write­­­­_ok,表示副线程的写入文件操作完毕,主线程可工作。同时,主线程执行输出到字符串数组前需要等待write_ok的信号,副线程工作前需要等待read_ok的信号。

 

这个DEMO程序模拟了多线程读写处理和单线程读写处理的比较:

 

 

命名为multi_thread_read_write_demo.c,由于需要多线程库文件,编译命令如下:

gcc -o multi_thread_read_write_demo multi_thread_read_write_demo.c –lpthread

 

/*** MULTI THREAD DEMO ***/

reading

establishing data structure

exporting data to array

notify writing thread start working ==>

destroying data structure

                     writing

reading

establishing data structure

                     <== notify main thread start exporting

exporting data to array

notify writing thread start working ==>

destroying data structure

                     writing

reading

establishing data structure

                     <== notify main thread start exporting

exporting data to array

notify writing thread start working ==>

destroying data structure

                     writing

                     <== notify main thread start exporting

well done, time spent 40 seconds

 

 

/*** SINGLE THREAD DEMO ***/

reading

establishing data structure

exporting data to array

                     writing

destroying data structure

reading

establishing data structure

exporting data to array

                     writing

destroying data structure

reading

establishing data structure

exporting data to array

                     writing

destroying data structure

well done, time spent 54 seconds

 

根据短板效应,这样的设计在写入文件的耗时占总耗时的一半左右的时候,效率最高。如果写入文件的耗时所占的比例很高,也就是文件的转换处理相对简单,这样的多线程设计并没有太大的必要。相反,如果写入文件的耗时所占的比例很低,那么就要考虑一下各个转换步骤的效率是否存在问题了,因为正常情况下,很少有慢得过写磁盘的操作。顺便提一下,上一篇文提到的strcat的问题,不改的话,还真的可能比写磁盘还要慢。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值