高并发存文件求解决方案

shsyzl007 2016-05-09 09:20:05
数据每500ms过来一次,也就是每个品种每秒会过来两条数据,每条数据只有一个价格一个时间
我现在要实时保存50个品种的数据,这样算每秒大概需要保存100条数据

以下方法都发现有堵塞现象,前面的还没保存完后面的数据又来了。
1.把每个保存放在一个线程里面
2.每个品种自动生成一个txt保存
3.用sqlite,发现这个数据库事务保存数据非常快,单条保存也很慢。刚测的保存1000条数据大概10秒的样子,但今天在公司测的同样的代码保存100条数据需要6秒。

有什么好办法解决吗
...全文
303 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞天凤凰601 2016-05-10
  • 打赏
  • 举报
回复
你怀疑你数据没作索引……
  • 打赏
  • 举报
回复
sqllite?单机? 本来还想说消息队列的……
puler 2016-05-10
  • 打赏
  • 举报
回复
思路应该都是: 收集数据----统一分类存放到内存----集中插入数据库
cancerser 2016-05-10
  • 打赏
  • 举报
回复
不是什么大问题
先说说sqlite的问题,这货是文件型数据库,大规模并发就是排队,到这就是瓶颈,你如果换成SqlServer按照你的实现思路就没问题了。
如果你一定要使用sqlite,也可以,你需要将程序改成这样:每几秒保存一次(看心情),接到数据后放在内存里,看心情统一插入,人为避开文件瓶颈。10秒钟单开线程插一次,估计就没问题了。
不过我建议你改成,接到数据后插入数据库,插入完成后再次插入(插入时接收的数据保存在内存,以插入数据的时间为间隔进行操作)。这样就可以了。
tanta 2016-05-10
  • 打赏
  • 举报
回复
数据量不大的情况下,可以先把数据写入内存,然后间隔一定时间保存一次。
tanta 2016-05-10
  • 打赏
  • 举报
回复
引用 10 楼 oysy 的回复:
你怀疑你数据没作索引……
索引好像会影响插入速度?
xian_wwq 2016-05-10
  • 打赏
  • 举报
回复
没有事务的时候,SQLite的插入操作使用了太多的IO操作,而是用事务的话,只需要一次IO。 搜下 Sqlite批量插入, 如果优化后仍然不行, 那是不是该考虑换种数据库
xuzuning 2016-05-10
  • 打赏
  • 举报
回复
500ms 50条数据,分开处理的话 平均每条数据的处理时间是 10ms,如果按品种保存到文件的话,时间应该是充足的。不知为何会发生阻塞 SQLite 并不适合多线程工作,启用事务时就是单线程的, 500ms 50条数据,时间应该是够的 如果确因库文件较大,导致打开很慢的话(要是打开了就不关闭呢),可以考虑用内存库做中转 使用数据库时,插入操作不应打开索引
yingdediyi 2016-05-10
  • 打赏
  • 举报
回复
批量保存数据可以使用sqlcopybulk,执行效率很快
江南小鱼 2016-05-09
  • 打赏
  • 举报
回复
1、把每个保存放在一个线程里面 我估计会有线程间争夺资源的问题 2、每个品种自动生成一个txt保存 我估计你是每个品名启动一个线程,和方法一有同样的问题 3、用sqlite,发现这个数据库事务保存数据非常快,单条保存也很慢。刚测的保存1000条数据大概10秒的样子,但今天在公司测的同样的代码保存100条数据需要6秒。 大批量数据,不建议用sqlite。 可以考虑事件触发机制,收到请求触发一个写事件,事件间是透明的,不会出现拥堵现象。
  • 打赏
  • 举报
回复
“数据库事务”是关系数据库的硬伤。所以如果你要高速处理数据持久化(例如每秒写几万条记录),那么你应该使用 NoSql,或者其它非数据库的数据持久化框架。这里主要就是避开“事务”机制。
  • 打赏
  • 举报
回复
sqlite只有在启用事务时比较快,如果不显式启用事务则慢得要死。 如果你要保存100条数据,你应该显式地在“一个”事务中保存这100条数据,而不应该用多个事务(或者不显式启用事务)。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧