我目前正在开发一个 Java 项目,我必须在一个非常大的数据集上执行多个信息检索和分类任务。一个小集合将有 10K 个文档。每个文档中大约有 100 个 150 维的双精度向量。所以大约有 150 个双打或 150M 双打的 1M 个向量。存储后,我需要召回所有这些或其中的一部分并执行聚类(例如 KMEANS)。实际收藏有更多文档(我目前正在处理 200K 文档)。
当然,我已经多次处理过 OutOfMemoryError,我最后一次解决这个问题的方法是存储在 10 个总大小 > 5GB 的巨大 XML 文件中。文件必须为 10,因为 DOM Writer 内存已满。对于阅读,我使用了 SAX Parser,它完成了这项工作而无需将它们加载到内存中。此外,将 double 存储到任何类型的文本中都会增加他的实际大小并增加解析和转换的计算成本。最后,聚类算法通常是迭代的,因此它们将一次又一次地需要相同的数据。我的方法没有缓存任何东西,它只是从磁盘读取了很多次。
我现在正在寻找一种更紧凑的方式来以二进制格式(数据库、原始二进制文件等)存储任意数量的数据,以及一种读取它们的有效方式。有没有人有什么想法可以提出?