大量数据查询再保存,如何优化

20w+数据查询到内存中,经过数据处理,保存到另一个表里面,如何优化避免产生内存溢出的风险?

一般就是分批操作,比如一次只操作一万条,处理完之后插入到另外一个表,当然这个是建立在处理这些数据的时候不需要全量的数据。
另外你可以先大体估算下这些数据会占用多少的内存,比如说一条数据占用 1k的内存,20w就会占用到大约200M的内存,中间拷贝一份,也不过才400M内存,只要你的服务分配的jvm比较大,就不用太过担心内存溢出的风险。

在处理大量数据时,避免内存溢出风险的一种方法是使用数据流方法,而不是一次将所有数据加载到内存中。这意味着数据是以小块的方式处理的,而不是一次处理所有数据,从而允许您在不耗尽内存的情况下处理大型数据集。

根据问题的具体细节,有几种方法可以在Python中实现这一点。以下是几个示例:

1、如果正在处理大型文件,可以使用带有缓冲参数的open函数来指定读取缓冲区的大小,该缓冲区控制一次从文件中读取的数据量。这允许您控制用于存储文件数据的内存量。

2、如果您正在处理存储在数据库中的大型数据集,则可以使用游标对象以小块形式迭代查询结果,而不是一次将整个数据集加载到内存中。这允许您一次处理一个数据块,而不会耗尽内存。

3、如果正在处理存储在Pandas DataFrame中的大型数据集,则可以使用DataFrame。iterrows()方法一次迭代DataFrame的行,而不是一次将整个DataFrame加载到内存中。这允许您一次处理一个数据块,而不会耗尽内存。

总的来说,在处理大型数据集时避免内存溢出的关键是以小块的方式处理数据,而不是一次将所有数据加载到内存中。通过使用上述方法之一,您可以在不耗尽内存的情况下处理大型数据集。

分批输入缓存读取数据

推荐你3种常见的方式:
1、数据库性能好的话,使用数据的存储过程去处理数据,这种最高效,就是会给数据库到去压力。实际中可以使用从库去搞;
2、分析自身的业务,能分批处理就分配处理;这个我们不了解你的处理业务,不好判定进一步方案;这种要看业务服务器了,
3、数据分页读出来,丢到中间价里面去,然后使用流式聚合计算;这种内存没压力,就是硬件成本高

可以采用ETL工具进行抽取,这样既能保证准确,也能提高效率

分类分批

可以考虑以下两种方式:
1、可以先将使用insert select 语句拷贝源表至目标表,然后直接使用Sql对目标表数据操作。
2、取源表数据时根据id排序,然后分页处理。
具体实现还是要看处理的需求。

如果时效性不高的话,可以考虑定时任务或者消息队列的方式,逐步插入

1,当天的记录会放在一个独立的表中.主要是针对实时的插入的记录,记录不要太多以免插入的时候维护索引的开销稳定在一个范围内。
2,历史的记录会按天分区的形式保存在历史表中。这个表一天只会批量的插入一次数据(用的是分区交换的方法)。
3,分区的索引对我的业务性能不好,因为要跨天 查询。历史查询最长时间段是一个月的时间,如果按照一个月一个分区的话,一个分区差不多是一个亿的记录,
就算是按月分区的话,再创建分区的本地索引,如果是时间段跨了月份的话估计分区的本地索引性能估计也不行。
4,后来采用一个方案,DB层上面再放了一个缓冲层,就是我最近在测试的Timesten关系型内存数据库,按照时间的老化策略缓冲一个月的数据。具体不展开说了。涉及的内容很多。
如有帮助,望采纳

提供参考实例【数据库SQL优化大总结1之- 百万级数据库优化方案】,详细讲解了不同情况下的优化思路:http://www.manongjc.com/detail/50-khwscrhqpwgaujs.html
【从开始讲解1、返回更少的数据2、减少交互次数3、减少数据库服务器CPU运算 到后面用实例代码的形式去分析,条理清晰,值得看看】

不知道你描述的问题是 指20w+数据的查询阶段,还是数据处理后写入另一张表的阶段
前者大批量查询建议分页去查 然后批次处理, 如果非要一次性查出来,20w+ 不是特别频繁的话也不是不可以,做好数据库的索引查询优化,只是硬件压力比较大
后者大批量写入数据库可以使用sqlbulkcopy

有时间限制么?没有时间限制的话就分批处理,有时间限制的话就要权衡时间、线程数和内存

程序上讲要指定范围,搜索指定的范围可以减少内存消耗。另外尽量不要使用特殊字符,有时候会混乱限定的范围。