我想用Java(尽可能少的内存和尽可能快的访问)有效地加载大型CSV格式的文件(通常为200-600mb)。目前,该程序正在使用一串字符串列表。此操作之前是通过一个Lua程序处理的,每个CSV行使用一个表格来保存每个“行”表格。Java - 如何有效地存储大量的字符串数组
下面是对存储器的差异和加载时间的示例:
- CSV文件 - 232mb
- 的Lua - 549mb在存储器 - 157秒加载
- 爪哇 - 1,378mb在存储器 - 12加载的秒数
如果我没记错的话,Lua表中的重复项存在作为对实际值的引用。我怀疑在Java的例子中,List持有每个重复值的单独副本,这可能与更大的内存使用有关。
下面是CSV文件内的数据的一些背景:
- 每个字段包括一字符串的
- 每行内的特定字段可以包括一组字符串(例如,字段中的一个3可以是“红”,“绿”或“蓝”)。
- 还有很多重复内容中的字符串。
下面是什么,可能需要加载的数据的一些例子:
- 搜索通过试图匹配给定的字符串,返回匹配的字符串在GUI
- 显示匹配的所有字符串表(可通过字段排序)。
- 改变或替换字符串。
我的问题 - 是否有一个需要更少的内存来保存数据,但仍然提供功能,以方便,快速地搜索/排序数据的集合?
如果你知道该列3只持有少数可能的值,你可以[实习生他们(http://docs.oracle .com/javase/7/docs/api/java/lang/String.html#intern%28%29)以减少内存使用量。另请参阅:http://stackoverflow.com/a/1855195/829571 – assylias
感谢assylias我将运行一些测试使用它。你知道它是否对短字符串有效 - 例如“去”或“去”。大多数字段包含45个字符的字符串,但有些字符串很短(4个或更少)。 – user1816198
看看http://stackoverflow.com/questions/12792942/alternatives-to-java-string-interning –