首页 新闻 会员 周边 捐助

c#读多个文本问题

0
[待解决问题]

有1万个文本,每个3-15M,需要逐行读,解析有用信息,写入sqlite中。怎么读和写效率高。多线程也试了试,数据并行,还是有些慢。怎么能进一步提高效率。单机作战不是分布式。还就就是sqlite为单写数据库,多线读写入sqlite中需要加锁,也影响一定的效率。我sqlite原因主要是为了嵌入式,不用安装数据库。请高手赐教,非常感谢!

c#
CodeFish7的主页 CodeFish7 | 菜鸟二级 | 园豆:202
提问于:2020-02-20 22:46
< >
分享
所有回答(3)
0

性能优化就是考验一个人的耐心

  1. 简单粗暴的方法,就是买好的SSD,升级内存和CPU。
  2. 代码方面的话,比较复杂和麻烦。
    2.1. 首先你得测试一下,在没有干扰的情况下,读文件的时间,处理数据的时间,保存到Sqlite数据库的时间,还得分别测试各种不同的场景,一次十条,一次一百条等等。
    2.2. 然后才能对症下药,瓶颈在哪儿?
爱编程的大叔 | 园豆:30844 (高人七级) | 2020-02-21 09:53

主要是还读文件用的时间,文件都不怎么大主要是多,70%时间用在这块;30%时间在sqlite这块,插入sqlite开启事务批量插入,时间差不多,关闭sqlite同步,略有提高。

支持(0) 反对(0) CodeFish7 | 园豆:202 (菜鸟二级) | 2020-02-21 12:58

@CodeFish7: 提供一个思路,你可以试一下。
1万个文本 “ 主要是还读文件用的时间,文件都不怎么大主要是多,70%时间用在这块”
A 减少文本个数。
合并形成临时文本
(注意:文本大小和读取速度的平衡点,需要来测试多少M文本平均读取速度最大)
B 再读取临时文本

支持(0) 反对(0) forearm | 园豆:200 (初学一级) | 2020-02-23 15:29

@CodeFish7: 文件IO,也就是磁盘的性能,通常是一个系统中最差的,
包括你的SQLite数据库,也是需要写入磁盘的。
所以基本上来说,多线程的用处很小。(多线程是CPU,不是磁盘)
简单来说,买一块好的SSD,你的问题就解决了。
或者读取的文件放在不同的物理硬盘上都能有所提升。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2020-02-24 14:32
0

70%的线程用来都文本,10%的线程用来解析,20%的线程用来写入数据库

jqw2009 | 园豆:2341 (老鸟四级) | 2020-02-21 19:32
0

建立线程池,然后每个读文本一个线程;解析也是线程;写数据库也是线程。这样节省系统资源,效率也高一些。

lzhdim | 园豆:650 (小虾三级) | 2020-02-26 17:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册