gpt4 book ai didi

java - 读取大文件(Java堆空间)

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

我想读取 CSV 文件,从每一行创建对象,然后将这些对象保存到数据库中。当我从文件中读取所有行并将所有对象存储在 ArrayList 中时,我收到 Java 堆空间错误。我尝试在读取后立即保存每条记录,但是通过 Hibernate 方法 save() 保存记录需要花费很多时间。

我还尝试检查 arrayList 的大小,并在该大小等于 100k 时保存数据(代码的注释部分)。

问题:有什么方法可以部分读取文件或更好地在 Java 中存储数据吗?

String[] colNames;
String[] values;
String line;
Map<Object1, Object1> newObject1Objects = new HashMap<Object1, Object1>();
Map<Object1, Integer> objIdMap = objDao.createObjIdMap();

StringBuilder raportBuilder = new StringBuilder();
Long lineCounter = 1L;
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(filename), "UTF-8"));
colNames = reader.readLine().split(";");
int columnLength = colNames.length;

while ((line = reader.readLine()) != null) {
lineCounter++;
line = line.replace("\"", "").replace("=", "");
values = line.split(";", columnLength);

// Object1
Object1 object1 = createObject1Object(values);
if (objIdMap.containsKey(object1)) {
object1.setObjId(objIdMap.get(object1));
} else if (newObject1Objects.containsKey(object1)) {
object1 = newObject1Objects.get(object1);
} else {
newObject1Objects.put(object1, object1);
}

// ==============================================
// Object2
Object2 object2 = createObject2Object(values, object1,
lineCounter, raportBuilder);
listOfObject2.add(object2);
/*
logger.error("listOfObject2.size():"+listOfObject2.size());
if(listOfObject2.size() % 100000 == 0){
object2Dao.performImportOperation(listOfObject2);
listOfObject2.clear();
}
*/
}
object2Dao.performImportOperation(listOfObject2);

最佳答案

如果您想处理非常大的文件,增加最大堆大小不会有帮助。你的 friend 是batching

Hibernate 并不隐式使用 JDBC 批处理,并且每个 INSERT 和 UPDATE 语句都是单独执行的。阅读 "How do you enable batch inserts in hibernate?"获取有关如何启用它的信息。

注意 IDENTITY 生成器,如 it disables batch fetching .

关于java - 读取大文件(Java堆空间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39834456/

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