大规模处理锯齿化整数对象

Large-scale processing of seralized Integer objects

本文关键字:整数 对象 处理 大规模      更新时间:2023-10-16

我有一个以下格式的大型数据集:

总共有 3687 个对象文件。每个都包含 2,000,000 条记录。每个文件的大小为 42MB。

每条记录包含以下内容:

  • 一个 id(整数值)
  • 值 1(整数)
  • 值 2(整数)
  • 值 3(整数)

每个文件的内容不会像在数据收集过程中观察到的那样以任何方式排序或排序。

理想情况下,我想为这些数据构建一个索引。(按 id 索引),这意味着以下内容:

  1. 将 ID 集划分为可管理的块。

  2. 扫描文件以获取与当前工作 ID 集相关的数据。

  3. 生成索引。

  4. 遍历下一个块并重复 1,2,3。

对我来说,这听起来不错,但来回加载 152GB 非常耗时,并且想知道最好的方法,甚至想知道 Java 是否真的是用于此类过程的正确语言。

我的机器上有 256GB 的内存和 32 个内核。


更新:让我修改一下,把 I/O 放在一边,并假设文件在字节数组中的内存中。

解码具有 2,000,000 条记录且每条记录包含 4 个序列化的 42MB 对象文件的最快方法是什么。

你对文件格式的选择非常糟糕。我会将批量从序列化的整数转换为用 DataOutputStream.writeInt() 编写的二进制整数,并使用 DataInputStream.readInt() 读取它们。在这两种情况下,下面都有缓冲流。您将节省大量磁盘空间,因此也将节省 I/O 时间,并且还可以节省所有序列化开销时间。并更改您的收藏软件以在将来使用此格式。转换需要一段时间,但只发生一次。

或者按照建议使用数据库,再次使用本机整数而不是序列化对象。

所以,我要做的是加载每个文件并将 id 存储到某种排序结构中 - std::map 也许 [或 Java 的等价物,但考虑到可能需要大约 10-20 行代码来读取文件名,然后将文件的内容读入映射,关闭文件并请求下一个文件, 我可能只是写C++来做到这一点]。

我真的看不出您还能/应该做什么,除非您真的想将其加载到 dbms 中 - 我认为这根本不是不合理的建议。

嗯,似乎更好的方法是使用某种DBMS。将所有数据加载到数据库中,您可以利用其索引、存储和查询功能。当然,这取决于您的要求是什么 -- 以及 DBMS 解决方案是否适合此要求

鉴于您的可用内存比数据集>,并且您想要非常高的性能,您是否考虑过 Redis? 它非常适合对简单数据结构进行操作,并且性能非常快。

在存储值时,让 java 执行默认序列化时要小心一点。 我以前遇到过我的原语在序列化之前自动装箱的问题。