多线程添加数据,如何去重 3C

数据来源是某网站上的公开数据,而且不排除这些数据会不定时更新...不过由于数据量比较大,所以我就想用多线程添加进数据库. 但是在入库的时候发现数据出现大量重复:我当时开了4个线程,最后存入数据库的数据量就是标准的4倍之多,也就是单个线程他已经把全部数据都取下来了. 但如果不用多线程的话,执行效率着实有点低. 有什么办法能在数据进入数据库之前就去重吗? 毕竟我不想对数据库做什么改动,而且数据库的效率有点低...

6个回答

性能开销在网络上不在内存和cpu
所以你将抓取的数据放入hashtable等,共享一个集合,统一写入数据库。

sinat_30048563
极北之地_ 回复caozhy: 删除数据之前我该如何判断这些数据是否已经入库呢?
大约 5 年之前 回复
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 你的采集速度不会很快的。
大约 5 年之前 回复
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 回复极北之地_: 不会,你可以定时将一段时间以前的数据从内存删除。
大约 5 年之前 回复
sinat_30048563
极北之地_ 现在的情况是我需要将数据先放入本地内存,然后再存入数据库. 我担心内存会爆...
大约 5 年之前 回复

图片说明

还有就是数据源是按页取出的,我在想有什么方法能让每个线程在执行"取数据"之前来获知自己该去取第几页的...

你可以根据数据源的分页来取,比如URL中有一个参数等来标识第几页,这样就可以不同的线程去访问不同的页面,参数不一样。这样拿到的数据就不会重复,然后再各自插入数据库、
这样的逻辑还可以多进程来做。进一步提高性能

sinat_30048563
极北之地_ 我突然觉得我自己获取数据的方法写的就有点僵硬,没有考虑到多线程访问的情景,以及利用页码这个参数
大约 5 年之前 回复

楼上的思路不错,共享一个集合,统一写入数据库。

不同线程分页采集也能有效减少重复;

如果你的线程采集速度足够快,不考虑网络、数据库等开销,可以为数据库添加一个varchar(32)的唯一列,值为要插入内容的MD5,
这样重复的内容就无法入库了。也可以声明一个全局的Map,保存已经入库的MD5,这样发现Map中已经存在就不需要执行入库操作,
没有就添加到Map中并执行入库操作;

sinat_30048563
极北之地_ 现在卡在分页采集数据这了,不知道该如何保证作为页码的变量如何在每个线程start时被采用,叠加,不被重置
大约 5 年之前 回复
sinat_30048563
极北之地_ 但是刚发现那个网站上它的数据就有重复,这就无解了...
大约 5 年之前 回复
  1. 不同线程分页采集,保存在数据库中表A。
  2. 将表A去重,保存到表B。

这样可以保存原始数据以备以后使用。

sinat_30048563
极北之地_ 分页采集数据我不知道该怎么实现...
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐