gpt4 book ai didi

java - ArrayList 内存不足错误

转载 作者:行者123 更新时间:2023-12-01 06:07:07 25 4
gpt4 key购买 nike

我尝试从 SQL 数据库检索 100,000 条记录,但在使用 ArrayList 时出现内存不足错误。

如何优化我的代码来实现这一目标?如何将享元设计模式应用到我的代码中?

import java.math.BigDecimal;
import java.util.*;

public class Foo {
public List<Vo> Service(Vo vo) throws Exception {
HashMap<Integer, Object> param = null;
ArrayList<HashMap<String, Object>> getRows = null;
HashMap<String, Object> row = null;
Vo Vo = null;

try {
List<Vo> list = new ArrayList<Vo>();

if (Vo != null) {
param = new HashMap();

if (Vo.getCode() != null) {
param.put(1, Vo.getCode());
param.put(2, Vo.getCode());
}
if (Vo.getCode() != null) {
param.put(3, Vo.getCode());
param.put(4, Vo.getCode());
}

getRows = (ArrayList) ImpDAO.RetrieveQuery(param);

if ((getRows != null) && (getRows.size() > 0)) {
for (Iterator iterator = getRows.iterator(); iterator.hasNext();) {
Vo = new Vo();
row = (HashMap) iterator.next();

if (row.get("CODE") != null)
Vo.setDept((BigDecimal) (row.get("CODE")));
if (row.get("SER") != null)
Vo.setServCode(row.get("SER").toString());
if (row.get("NAME") != null)
list.add(Vo);
}
}
}
} catch (Exception ae) {
throw ae;
}

return list;
}
}

最佳答案

双数据结构

我看到的最大问题是(ArrayList)ImpDAO.RetrieveQuery(param):RetrieveQuery 已经返回 HashMap 列表。因此,您的数据结构在内存中存在两次,尽管它们可能指向相同的对象。

考虑更改 RetrieveQuery 以返回由基础结果集支持的迭代器(甚至更好是流)。这将使您不必在内存中保留两个具有相同内容的大型数据结构。

对象类型

row.get("SER") 的类型是什么?如果答案不是字符串,您可能会为每一行创建一个新字符串。这将大大增加您的内存占用量。

row.get("CODE") 怎么样?这是否需要是 BigDecimal? int 也能工作吗?如果是这样,您可以通过切换在每行上节省一些字节。

100k 是很多行

几乎没有理由同时获取 100k 行。这是要到ui来显示吗?如果是这样,你真的会一次显示 100k 行吗?也许你应该看看分页。这是要进行加工作业吗?也许我们可以设置一个限制并分块处理它。

问这种问题会让人想知道 underlying problem 是什么?是。

关于java - ArrayList 内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42073539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com