我是天体物理学的研究生。我使用大部分由其他人开发的代码运行大型模拟十多年。有关这些代码的示例,您可以查看小工具http://www.mpa-garching.mpg.de/gadget/和 enzo http://code.google.com/p/enzo/。这绝对是两个最成熟的代码(它们使用不同的方法)。
这些模拟的输出是巨大的。根据您的代码,您的数据会有所不同,但它始终是大数据。你通常需要数十亿个粒子和细胞来做任何现实的事情。最大的运行是每个快照 TB 和每个模拟数百个快照。
目前,读取和写入此类数据的最佳方式似乎是使用 HDF5 http://www.hdfgroup.org/HDF5/,这基本上是使用二进制文件的一种有组织的方式。与带有自定义标头块的未格式化二进制文件相比,这是一个巨大的改进(仍然让我做噩梦),但我不禁认为可能有更好的方法来做到这一点。
我想纯粹的数据大小是这里的问题,但是是否有某种数据存储可以有效地处理 TB 的二进制数据,或者二进制文件是目前唯一的方法?
如果有帮助,我们通常按列存储数据。也就是说,你有一个所有粒子 id 的块、所有粒子位置的块、粒子速度块等。它不是最漂亮的,但它是在某些体积中执行诸如粒子查找之类的最快的。
编辑:抱歉对这些问题含糊不清。史蒂夫是对的,这可能只是数据结构而不是数据存储方法的问题。我现在必须跑步,但我会在今晚或明天晚些时候提供更多细节。
编辑 2:所以我研究得越多,我就越意识到这可能不再是数据存储问题了。未格式化的二进制文件的主要问题是正确读取数据的所有令人头疼的问题(获得正确的块大小和顺序并确定它)。HDF5 几乎解决了这个问题,在文件系统限制得到改善之前不会有更快的选择(感谢 Matt Turk)。
新问题可能归结为数据结构。HDF5 的性能与我们所能得到的一样好,即使它不是最好的查询接口。习惯了数据库,我认为能够查询诸如“随时给我所有速度超过 x 的粒子”之类的东西会非常有趣/强大。你现在可以做类似的事情,但你必须在较低的水平上工作。当然,考虑到数据有多大,并且取决于你用它做什么,为了性能,在低级别工作可能是一件好事。