Java - 如何有效地存储大量的String数组

use*_*198 5 java csv lua

我正在尝试使用Java高效加载大型CSV格式的文件(通常为200-600mb)(内存更少,访问速度更快).目前,该程序正在使用字符串数组列表.之前使用Lua程序处理此操作,该程序使用每个CSV行的表和用于保存每个"行"表的表.

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

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

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

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

  • 每个字段由一个字符串组成
  • 每行内的特定字段可以包括一组字符串中的一个(例如,字段3可以是"红色","绿色"或"蓝色").
  • 内容中有许多重复的字符串.

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

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

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

Fra*_*ank 0

为了优化您的内存问题,我建议使用享元模式,特别是对于具有大量重复项的字段。

作为集合,您可以使用TreeSetTreeMap

如果您为您的类提供了良好的实现LineItem(implementequalsComparable),您可以大量优化内存使用hashcode