当前位置:首页 > 内存 > 正文

解决大批量数据导入内存溢出

  • 内存
  • 2024-08-29 06:15:08
  • 9280

一、javaexcelpoi大数据量50W内存溢出用EXCEL打开50W的数据库也很困难。建议导入CSV格式文件或将其分成多个文件。
关于内存溢出,需要注意以下几点:
1.通过分页的方式从数据库中批量查询数据。
2.注意变量的释放,尤其是LIST、MAP等引用。如果它们被定义为全局变量或静态变量,它们将很难被释放。
3.增加虚拟机的内存大小。


二、java向数据库添加大量数据时内存溢出在不改变内存的情况下如何解决例如,如果要将一个有1000万条数据的数据库表导出到文件中;此时就可以进行分页了。当然,Oracle可以使用三层封装,而MySQL每次使用有限制。将创建一个新的查询,并且随着页面的转动,它会变得越来越慢。实际上,我们想要处理然后游向下游以编译一部分数据(例如10,000行)并写入。文件一次(关于写文件的细节我就不赘述了,这是最基本的部分)。需要注意的是,每次输出流写入缓冲区中的数据时,最好清除并刷新缓冲区。。接下来如果执行没有where条件的SQL,内存会爆炸吗?是的,这个问题值得思考。通过API,我们发现我们可以对SQL执行多种操作。例如via:preparedStatementstatement=eStatement(sql),这是默认的预编译。=eStatement(sql,_FORWARD_ONLY,_READ_ONLY);
设置游标,使其不直接将数据保存到本地存,然后每次通过设置chSize(200)来设置游标;传输过程的大小;好吧,我确实用过这个。使用Oracle和不使用没有什么区别,因为Oracle的jdbcAPI默认不会将数据存储到Java的内存中,MySQL中的设置也是无效的。根本就像我上面说的一堆废话,哈哈,我只是想说Java提供的标准API可能效不高。很多情况下,这取决于制造商的实现机制以及这个设置应该是什么。对网上很多人有效,但这纯粹是抄袭;对于Oracle,他们说不用担心,它不会缓存在内存中,因此Java内存不会造成任何问题。如果是mysql,也要先做同样的事情。使用版本5或更高版本,然后将useCursorFetch=true添加到连接参数。对于游标大小,您可以通过在连接参数中添加:defaultFetchSize=1000来设置,例如:
jdbc:mysql://


三、eclipse程序在跑批量的时候报Javaheapspace,请问应该怎么解决?(Main方法调用类的时候)记忆仿佛被淹没了。建议您检查程序是否存在内存泄漏问题。
由于我没有任何代码可看,所以我只能建议这个。
但是,根据你想要“批量运行”的情况,你需要在程序中立即读取大量内容到内存中,这最终会导致内存不足。
这时候,当你做批处理时,即使你把内存增加到1G或者2G,这个需求也能解决部分问题(即批处理的数量更大)但并不能解决本质问题。
解决本质问题,需要更改批处理程序,批量提交数据,处理程序就是发布。同时,如果要计算大量的数据,建议将数据存储在数据周期的中间,而不是直接和大量的数据一起存储。
经过这样的中间转换过程或小批量转换过程后,即使批量大小很高或数据量很大,您的批处理软件也不会出现内存问题。