gpt4 book ai didi

Java——如何高效地存储大量String数组

转载 作者:搜寻专家 更新时间:2023-11-01 00:51:34 25 4
gpt4 key购买 nike

我正在尝试使用 Java 高效地加载大型 CSV 格式文件(通常为 200-600mb)(更少的内存和尽可能快的访问)。目前,该程序正在使用字符串数组列表。此操作以前是通过 Lua 程序处理的,该程序为每个 CSV 行使用一个表,并使用一个表来保存每个“行”表。

下面是内存差异和加载时间的示例:

  • CSV 文件 - 232mb
  • Lua - 549mb 内存 - 157 秒加载
  • Java - 1,378mb 内存 - 12 秒加载

如果我没记错的话,Lua 表中的重复项作为对实际值的引用而存在。我怀疑在 Java 示例中,List 持有每个重复值的单独副本,这可能与较大的内存使用量有关。

以下是 CSV 文件中数据的一些背景:

  • 每个字段由一个字符串组成
  • 每一行中的特定字段可能包含一组字符串中的一个(例如,字段 3 可能是“红色”、“绿色”或“蓝色”)。
  • 内容中有许多重复的字符串。

以下是加载数据可能需要的一些示例:

  • 搜索所有试图与给定字符串匹配的字符串并返回匹配的字符串
  • 在 GUI 表中显示匹配项(可通过字段排序)。
  • 更改或替换字符串。

我的问题 - 是否有一个集合需要更少的内存来保存数据,但仍提供轻松快速地搜索/排序数据的功能?

最佳答案

一个简单的解决方案。你可以有一些 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);
}

关于Java——如何高效地存储大量String数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13332687/

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