【发布时间】:2012-10-31 05:25:12
【问题描述】:
我正在尝试使用 Java 有效地加载大型 CSV 格式文件(通常为 200-600mb)(更少的内存和尽可能快的访问速度)。目前,该程序正在使用字符串数组列表。此操作之前由 Lua 程序处理,每个 CSV 行使用一个表,每个“行”表使用一个表。
以下是内存差异和加载时间的示例:
- CSV 文件 - 232mb
- Lua - 549mb 内存 - 157 秒加载
- Java - 1,378mb 内存 - 12 秒加载
如果我没记错的话,Lua 表中的重复项作为对实际值的引用存在。我怀疑在 Java 示例中,List 保存每个重复值的单独副本,这可能与较大的内存使用量有关。
以下是 CSV 文件中数据的一些背景信息:
- 每个字段由一个字符串组成
- 每行中的特定字段可能包括一组字符串中的一个(例如,字段 3 可以是“红色”、“绿色”或“蓝色”)。
- 内容中有很多个重复的字符串。
以下是加载数据可能需要的一些示例:
- 搜索所有试图与给定字符串匹配的字符串并返回匹配的字符串
- 在 GUI 表格中显示匹配项(可通过字段排序)。
- 更改或替换字符串。
我的问题 - 是否有一个集合需要更少的内存来保存数据,但仍提供轻松快速地搜索/排序数据的功能?
【问题讨论】:
-
如果您知道第 3 列仅包含几个可能的值,您可以intern them 以减少内存使用量。另见:stackoverflow.com/a/1855195/829571
-
谢谢 assylias 我将使用它运行一些测试。你知道它是否对短字符串有效 - 例如“去”或“去”。大多数字段包含超过 45 个字符的字符串,但有些字段很短(4 个或更少)。
-
@PeterLawrey 不错 - 与
intern()相比,它的表现如何? -
@assylias 它速度更快,可扩展性更好,但它只能在尽力而为的基础上工作,如果您的大小小于唯一对象的数量,您将获得所有重复项。