gpt4 book ai didi

java - 在 Java 中保存大量数据列表的最佳实践

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:33 27 4
gpt4 key购买 nike

我正在用 Java 编写一个小型系统,我在其中从文本文件中提取 n-gram 特征,之后需要执行特征选择过程以选择最具鉴别力的特征。

单个文件的特征提取过程返回一个 map ,其中包含每个唯一特征及其在文件中的出现。我将所有文件的 map (Map)合并成一个 map ,其中包含从所有文件中提取的所有独特特征的文档频率(DF)。统一的 map 可以包含超过 10,000,000 个条目。

目前特征提取过程运行良好,我想执行特征选择,我需要在其中实现信息增益或增益比。我必须先对 Map 进行排序,执行计算并保存结果,以便最终得到一个列表(对于每个特征,它的特征选择分数)

我的问题是:容纳如此大量的数据(~10M)并执行计算的最佳实践和最佳数据结构是什么?

最佳答案

这是一个非常宽泛的问题,所以答案也会很宽泛。解决方案取决于(至少)这三件事:

  1. 条目的大小

存储 10,000,000 个整数将需要大约 40MiB 的内存,而存储 10,000,000 x 1KiB 的记录将需要超过 9GiB。这是两个不同的问题。将一千万个整数存储在任何现有 Java 集合的内存中是微不足道的,而在内存中保留 9GiB 将迫使您调整和调整 Java 堆和垃圾收集器。如果条目更大,比如 1MiB,那么您可以完全忘记内存存储。相反,您需要专注于寻找良好的磁盘支持数据结构,也许是数据库。

  1. 您使用的硬件

在具有 8 GiB 内存的机器上存储一千万条 1KiB 记录与将它们存储在具有 128GiB 内存的服务器上是不同的。前者几乎不可能完成的事情对后者来说微不足道。

  1. 您想进行的计算类型

您提到了排序,所以像 TreeMap 这样的事情或者也许 PriorityQueue浮现在脑海中。但这是最密集的计算吗?您用来对它们进行排序的键是什么?您是否计划根据其他非关键属性定位(获取)实体?如果是这样,则需要单独规划。否则,您需要遍历所有一千万个条目。

您的计算是在单线程还是多线程中运行?如果您可能同时修改数据,则需要单独的解决方案。 TreeMap 和 PriorityQueue 等数据结构必须被锁定或替换为并发结构,例如 ConcurrentLinkedHashMapConcurrentSkipListMap .

关于java - 在 Java 中保存大量数据列表的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27943897/

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