多线程处理表数据性能问题

现有表A,存在100000条符合条件的数据, 现在需要处理这些数据,逻辑为查出这些数据,然后处理后需要删除表A对应数据,同时插入表B,并且记录文件C
现在我的方案以及做法
1个查询线程分批查询这些数据到一个共享list 同时更新每批查出的数据的状态为X(正在操作,防止下一批数据查询时候重复),再起5个线程取这些数据,然后每个处理后批量删除表A对应取的数据,并且插入表B,并且写文件C

问题来了,代码写好后,测试发现功能无问题,可以正常实现,但是性能很差
因为一目了然,过多操作表A,因为查询需要更新状态(锁表) 每个线程需要删除数据(锁表),导致效率很差

暂时没有想到比较好的方法解决

补充之前考虑的方案2,分5个线程,在线程内查询并操作(没去实现,只是想法,应该也会存在这个问题)

个人考虑 如果能解决查询时候不更新状态 又能保证数据的唯一性,能提升一些性能,不知各位大大有何高见?

思路:一次加载部分A数据到内存,然后开启多个线程处理,处理的结果保存到内存,结果达到一定数量,写入B

1:加载A数据:A表单行数据平均占用空间大小1K,就加载1000条,总共也就1M左右,按照这个算法去加载,加载数量自行设定,一次数据库加载完毕保存到集合中List,作为源数据集合

2:开启多个线程,循环从源数据集合中取数据进行处理,处理结果保存到结果数据集合中,当结果数据集合数量达到1000(自行设定),暂停其他线程,写入数据到B,写入完毕清空结果数据集合后继续执行。当当前源数据集合中的数据库处理完毕,清空当前的源数据集合,继续从A表取数据保存到该集合中,直到A表没有数据为止

3:所有数据处理完毕,所有线程结束,如果结果数据集合中还有数据,继续写入到B表,执行写入C操作

4,清空A表追问

你的思路我认同 关键是处理后需要同步删除表A数据,所以给分批查询加载数据带来麻烦, 如查询1000条数据, 然后线程处理,后删除了500条 这个时候查询线程再去查询1000条 就会有重复数据了, 所以比较麻烦, 至于一次加载全部 不太科学,数据量大的话 如100000条 一次加载 需要的时间很长,不科学。

追答

第一: 我的思路在A表数据库处理完毕之前没有对A表进行修改操作

第二:我的操作是分批操作,分批读取A表操作

很多事情都是想复杂了

我原来按照这个思路,从数据库中读取用户名到网页中抓取数据进行处理之后保存到数据库
除了0.5%的超时玩,300W个用户ID,20多分钟采集完毕

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-03
首先需要明确的是对于A表的操作肯定不能处理一条删一条,所以建议的方案是对数据进行多线程分段查询,然后记录下需要删除的A表中数据的ID。第二个,对于插入B表的操作,肯定有锁定的问题,所以建议先分开来插入,比如分成 B1,B2等等。第三个,对于文件的操作同第二点。
在这些全部做完后,一次性对A表做删除操作,将B1等等分表的数据一次性插入B表,文件合并
只有这样才能充分利用多线程,而又避开锁表的问题。追问

你的意思是分段查询数据 并且不更新为状态X, 分配给线程处理,写文件 插表,然后数据都处理完了再统一删除所以表A数据? 如果数据量大的话 这些都放在内存中 这样好吗?

追答

对的,因为每段线程拿到的数据是不重复的,所以不必标记。数据量大的话,你可以利用临时表操作不必全放在服务器内存里,我上面也提到的,关键是先分再合,性能就会提高了

追问

你能详细说明下 利用临时表查询数据达到分批查询效果吗?

第2个回答  2013-05-03
你这里面存在一个事务的问题,所以一条一条处理肯定提高不了多少性能。所以多线程也不一定能解决。 如果不要求时效性,最好采用批量处理。如果是用Oracle数据库,那在数据库方面也要进行优化。
再者,我看你的操作都是数据库内部表数据库的转移,不知道你为什么要用外部程序来实现,我觉得可以用数据库存储过程来做,但具体不知道你的业务,所以可能有你的理由。
第3个回答  2013-05-03
数据库是支持多用户连接的。
嗯。你会查出十万条记录。
将这些分成五组。一个线程,一个连接,来操作这些数据不可以吗?

还有,不知道写入C的时候,要不要求顺序。如果要求顺序,多线程,好象无法保证。

多线程处理表数据性能问题
2:开启多个线程,循环从源数据集合中取数据进行处理,处理结果保存到结果数据集合中,当结果数据集合数量达到1000(自行设定),暂停其他线程,写入数据到B,写入完毕清空结果数据集合后继续执行。当当前源数据集合中的数据库处理完毕,清空当前的源数据集合,继续从A表取数据保存到该集合中,直到A表没有数...

c# 多线程同时写数据表速度变慢的问题
一般涉及网络、磁盘读写的程序采用多线程,计算过程使用多线程尚不划算。高性能并行计算使用c#不行。如果计算量大建议使用编译性语言(推荐使用FORTURN)。 .net属于半编译性平台,效率较低。

多核心的CPU处理Excel会快很多吗?
某种程度上讲,多核心处理器也可以覆盖很多需求,毕竟自身主频并不差劲,比如说7700K这样的处理器,单线程性能足够强大,多核心能力也数一数二;还有就是像Ryzen1700X、Ryzen1800X这类处理器,以错位竞争的形式将多核心多线程下放到中高端玩家市场。再有就是针对专业领域应用的CPU,比如Intel即将推出的i9...

hashmap为什么线程不安全
一、HashMap的数据结构问题 HashMap基于哈希表实现,通过键值对的存储方式提供高效的查找性能。但在多线程环境下,多个线程可能同时修改HashMap的内部结构,这种情况下可能导致数据冲突和不一致,从而出现数据错误或丢失。二、并发修改问题 当一个线程正在遍历HashMap的某个部分时,其他线程可能正在修改这些部分...

如何解决多线程造成的数据库死锁
我不懂JAVA,但死锁这个问题每种开发工具和数据库都会碰到.解决办法是:1、程序方面优化算法(如有序资源分配法、银行算法等),在一个程序里,能不用多线程更新同一张数据库表 尽量不要用,如果要用,其避免死锁的算法就很复杂。2、数据库方面设置等待超时时间 3、发生死锁后直接KILL掉数据库进程 ...

使用WPS excel时总是出现计算线程,导致速度很慢,如何解决
1、首先我们先打开excel,打开之后新建。2、新建之后我们进入到工作表,点击右上角的菜单。3、打开之后下面依次点击其他命令。4、打开之后我们进入到设置里面,下面有一个高级设置。5、在高级设置下有一个线程的选择。6、我们需要勾选上,设置为电脑CPU的最大值。Microsoft Office是一套由微软公司开发的...

多线程环境下,hashmap为什么会出现死循环?
在多线程环境下,HashMap出现死循环问题主要与JDK1.7版本的实现机制相关。当并发操作时,可能会导致闭合回路,引发CPU占用率100%的问题。原因在于HashMap内部使用Entry数组存储数据。通过哈希算法获取数组索引,并在该位置插入元素。若发生冲突,则在数组位置生成链表。在1.7版本中,当多线程环境下进行扩容...

锐龙9 3900X关闭多线程后,性能损失在所有应用中是否都均匀?
如7-Zip、Blender等,关闭多线程会导致性能下降明显,高达39%。另一方面,Web类应用在关闭多线程后反而有所提升,提升了3%至7.8%。这些结果表明,尽管主流处理器核心数众多,锐龙的多线程技术在特定任务中依然重要且有效。接下来,我们将在游戏测试中探讨这一现象的深层次原因。

ActiveReport多处理器和多线性的系统性能
在内存处理和I\/O工作负载繁重的情况下,高速二级缓存的优势才会显现出来,即使在它仅有30%到50%空闲时间的情况下,也能观察到奔腾ⅡXeon与奔腾Ⅱ之间的性能差距。在多线程的工作站环境中,如使用第二个CPU,性能提升幅度可以达到30%到95%,使得双奔腾ⅡXeon系统比双奔腾Ⅱ系统快3%到25%。然而,由于...

excel不启用多线程计算有啥影响
设置并打了多线程处理选项,线程数为N。假设,电子表格软件使用XLL函数处理了大量的单元格数据,它依次发送数据请求或远程服务请求。受限于依赖树拓扑结构,Excel几乎会同时调用此函数N次。多线程使计算过程足够快速以及拥有并发处理能力,电子表的重计算时间可能会因此减少到1\/N。

相似回答