我正在尝试使用Java高效加载大型CSV格式的文件(通常为200-600mb)(内存更少,访问速度更快)。目前,该程序正在使用字符串数组列表。此操作以前使用Lua程序处理,每个CSV行使用一个表,并使用表来保存每个“行”表。
以下是内存差异和加载时间的示例:
如果我没记错的话,Lua表中的重复项存在作为对实际值的引用。我怀疑在Java示例中,List正在保存每个重复值的单独副本,这可能与更大的内存使用量有关。
以下是CSV文件中数据的一些背景知识:
以下是加载数据可能需要的一些示例:
我的问题 - 是否有一个集合需要更少的内存来保存数据,但仍然提供了轻松快速地搜索/排序数据的功能?
答案 0 :(得分:1)
一个简单的解决方案。如果您将引用所有唯一字符串,则可以有一些HashMap
。
在ArrayList
中,您只需引用HashMap
中的现有唯一字符串。
类似的东西:
private HashMap<String, String> hashMap = new HashMap<String, String>();
public String getUniqueString(String ns) {
String oldValue = hashMap.get(ns);
if (oldValue != null) { //I suppose there will be no null strings inside csv
return oldValue;
}
hashMap.put(ns, ns);
return ns;
}
简单用法:
List<String> s = Arrays.asList("Pera", "Zdera", "Pera", "Kobac", "Pera", "Zdera", "rus");
List<String> finS = new ArrayList<String>();
for (String er : s) {
String ns = a.getUniqueString(er);
finS.add(ns);
}
答案 1 :(得分:0)
为了优化您的内存问题,我建议使用Flyweight模式,特别是对于有大量重复项的字段。
如果您为LineItem
课程(实施equals
,hashcode
和Comparable)提供了良好的实施方案,那么您可以大量优化内存使用。
答案 2 :(得分:0)
答案 3 :(得分:0)
答案 4 :(得分:0)
仅作为旁注。
对于您怀疑的重复字符串数据,您不必担心这一点,因为java本身都在关注它,因为所有字符串都是final,并且所有引用都以内存中的相同对象为目标。
所以不确定lua是如何完成工作的,但在java中它应该也非常有效