我正在尝试将csv文件解析为pojo。为此,我使用jackson-dataformat-csv。我正在测试我的程序的可扩展性,虽然时间似乎不是一个问题,它使用的内存是。我在csv中使用了超过一百万条记录来解析我的pojos。问题是将运行此服务器的服务器将具有大约1.5GB内存,到目前为止,我发现它在超过一百万条记录中使用了近2GB。我的问题是当我使用它时:
MappingIterator<T> objects = csvMapper.readerFor(pojoClass).with(csvSchema).readValues(csvFile);
List<T> list = objects.readAll();
我回来的清单差不多是2GB。当我创建一个包含一百万个pojos的列表时,我几乎没有使用任何内存。我正在创建这样的列表:
List<Pojo> pojos = new ArrayList<>();
for(int i = 0; i < 1000000; i++){
Pojo newPojo= getNewPojo();
pojos.add(newPojo);
}
我不确定为什么我得到的第一个列表是如此之大,以至于我可以使用相同数量的对象创建一个不同的列表,只是将它们放在那里并使该列表如此之小。如果我做错了什么以及我如何解决这个问题,请告诉我。感谢。
答案 0 :(得分:0)
我不确定您使用的是哪个库,但是如果找不到解决方案,可以尝试uniVocity-parsers迭代地阅读您的pojos?
CsvParserSettings parserSettings = new CsvParserSettings();
//...configure the parser
CsvRoutines routines = new CsvRoutines(parserSettings);
for (Pojo address : routines.iterate(Pojo.class, csvFile, "UTF-8")) {
//process your bean
}
希望这会有所帮助,我最近回答了类似的问题here。
免责声明:我是这个库的作者,它是开源和免费的(Apache 2.0许可证)