java如何读取1千万级别的数据

2 篇文章 0 订阅

如果数据很庞大的情况,估计没有人会直接使用

select * from table ;
select * from table limit 1000000;

之类的SQL语句,这样的操作别说数据库的操作很慢了,在网络IO传输也是一个很大的问题,
把一千万的数据读取出来在网络进行传输,这样性能消耗也会有瓶颈。
所以,读取大批量的数据一般都是采用分批次的读取方式。
(一)通过测试,一万条数据一次性读取出来所花费的时间要比分十次,每次读1千数据的速度要慢很多。
这里写图片描述
从上面的两张截图可以看出,执行limit1000的时候,所用的时间是0.095s,读十次,顶多也不到1s。
但是,执行limit 10000的时候,所用的时间是2.747s。差不多是3倍的时间。

(二),主键是uuid,可以进行排序,利用排序和比较值的大小来分批读取数据。

SELECT * FROM `kw_seo_keyword` as t
WHERE t.id > '31baf874-0fc5-4bb0-82ff-7bc77c6b63f5'
ORDER BY t.id
LIMIT 1000

每一次,读取一千条数据,然后取这一千条数据的有序集合的最后一条数据的id,在进行大小的比较。如此反复,直到数据读取完为止。

(三),安全性的考虑,执行上千万的数据,有时候程序出现异常,结果修改异常后再重新这上千万的数据,那就太蛋疼了。所以我们分批次处理数据的时候。
比如说,我们每次读取一千条数据,等集合的数据超过100万的时候,就处理数据,然后通过一个redis的key来保存最后一次的id。

while (!isFinish) {
            try {
                while (true) {
                    queryMap.put("id", id);
                    tempSeoKeywordList = seoKeywordMapper.getUnAggregateCharactWords(queryMap);
                    if (tempSeoKeywordList == null || tempSeoKeywordList.size() == 0) {
                        isFinish = true;
                        break;
                    }
                    for (SeoKeyword seoKeyword : tempSeoKeywordList) {
                        crawlerKeyword = new CrawlerKeyword();
                        crawlerKeyword.setKeywordId(seoKeyword.getId());
                        crawlerKeyword.setKeyword(seoKeyword.getKeyword());
                        crawlerKeyword.setPageNumber(1);
                        seoKeywordList.add(crawlerKeyword);
                    }
                    id = tempSeoKeywordList.get(tempSeoKeywordList.size() - 1).getId();
                    if (seoKeywordList.size() == 1000000) break;
                }
                if (seoKeywordList.size() != 0) {
                    CrawlingTask crawlingTask = new CrawlingTask().setTaskId(StringUtil.uuid()).setProtos(seoKeywordList);
                    TaskDirector.submitTask(QueueClientHelper.queue_kw_wapbaidu_agg, crawlingTask);
                    redisUtil.set(RedisKey.Prefix.LAST_COMPLETE_AGG_ID, ((CrawlerKeyword) seoKeywordList.get(seoKeywordList.size() - 1)).getKeywordId());
                    seoKeywordList.clear();
                }
            } catch (Exception e) {
                isFinish = true;
                logger.info("聚合特征词扔到爬虫队列任务执行失败------");
                e.printStackTrace();
            }
        }

附上,最近做的项目的代码作为例子。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在处理千万级数据下载时,EasyExcel是一种非常适合的工具。EasyExcel是一款基于Java的开源Excel操作工具,它旨在简化大规模Excel数据处理操作。以下是使用EasyExcel进行千万级数据下载的几个步骤: 1. 首先,我们需要在项目中引入EasyExcel的相关依赖。可以通过Maven或者Gradle进行依赖的管理和导入。 2. 接下来,我们需要定义一个数据模型对象,该对象将映射Excel表格中的数据。可以通过注解来定义对象属性与Excel表格的关系,使数据读取和写入更加便捷。 3. 然后,我们需要创建一个ExcelWriter对象,用于写入数据到Excel。可以指定Excel表格的名称、表头等信息。 4. 对于千万级别的数据下载,我们通常不会一次性将所有数据加载到内存中,而是采用分页查询的方式获取数据并写入Excel。可以根据具体需求进行分页处理和数据查询。 5. 在数据写入过程中,EasyExcel提供了一种基于监听器的方式来处理数据读取和写入。我们可以实现相应的监听器接口,在监听器方法中进行数据的操作,例如数据的处理、转换、格式化等。 6. 最后,将数据写入完毕后,需要调用ExcelWriter对象的finish方法来关闭流并输出Excel文件。 总之,EasyExcel提供了一种简便高效的方式来处理大规模数据的Excel下载。通过合理的技术选型和优化,我们可以轻松应对千万级数据的下载需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值