大规模处理锯齿化整数对象
Large-scale processing of seralized Integer objects
我有一个以下格式的大型数据集:
总共有 3687 个对象文件。每个都包含 2,000,000 条记录。每个文件的大小为 42MB。
每条记录包含以下内容:
- 一个 id(整数值)
- 值 1(整数)
- 值 2(整数)
- 值 3(整数)
每个文件的内容不会像在数据收集过程中观察到的那样以任何方式排序或排序。
理想情况下,我想为这些数据构建一个索引。(按 id 索引),这意味着以下内容:
-
将 ID 集划分为可管理的块。
-
扫描文件以获取与当前工作 ID 集相关的数据。
-
生成索引。
-
遍历下一个块并重复 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 执行默认序列化时要小心一点。 我以前遇到过我的原语在序列化之前自动装箱的问题。
- C++使用整数的压缩数组初始化对象
- 为对象分配整数.输出将是什么?
- 获取我的基类以递增派生类对象整数
- C++对象(整数)
- 如何声明包含整数数组的对象
- 静态强制转换允许转换对象指针,但不允许转换整数
- 如何使用 c++ 模板实现整数、字符串、浮点数和日期对象的数组
- 具有整数成员的对象的 printf
- 如何在不使用对象的情况下连接字符串、整数和浮点数
- 如何使用字符串流对象多次将整数转换为字符串
- 如何在具有指向对象的指针数组的类中创建复制构造函数和析构函数,其中对象本身具有指向整数的指针数组
- C++插入到地图<双精度、多地图<整数、对象*>>
- 如何在对象中正确使用整数和浮点
- 运算符重载 - 将对象与整数进行比较
- C++:从字符串对象中提取整数
- C++宏整数和对象定义
- C++ - 使用 stringstream 对象从外部 txt 文件中的句子中读取字符串和整数
- 使用构造函数c++将一个长整数转换为类对象
- c++中带整数和对象的操作符重载
- 大规模处理锯齿化整数对象