所以我有一个"大"的数字数据的"非常大"的ASCII文件(一共几千兆字节),我的程序需要至少按顺序处理整个数据.
有关存储/加载数据的建议吗?我曾想过将文件转换为二进制文件以使它们更小并加快加载速度.
我应该一次性将所有内容加载到内存中吗?
如果没有,是否打开了部分加载数据的好方法?
什么是与Java相关的效率提示?
那么如果处理需要在多个文件和多个缓冲区的数据中跳转呢?二进制文件的不断打开和关闭会变得昂贵吗?
我是'内存映射i/o'的忠实粉丝,又名'直接字节缓冲区'.在Java中,它们被称为 Mapped Byte Buffers是java.nio的一部分.(基本上,这种机制使用操作系统的虚拟内存分页系统来"映射"你的文件,并以编程方式将它们作为字节缓冲区提供.操作系统将自动神奇且非常快速地管理磁盘和内存中的字节.
我建议这种方法,因为a)它适用于我,和b)它将让你专注于你的算法,让JVM,操作系统和硬件处理性能优化.他们经常知道什么是最好的,比我们低级程序员更好.;)
您将如何在您的上下文中使用MBB?只需为每个文件创建一个MBB,然后根据需要阅读它们.您只需要存储结果..
顺便说一句:你用GB处理了多少数据?如果它超过3-4GB,那么在32位计算机上这将不适合您,因为MBB实现是平台架构在可寻址内存空间上的被告.64位计算机和操作系统将带您到1TB或128TB的可映射数据.
如果您正在考虑性能,那么请了解Kirk Pepperdine(一位有点着名的Java性能大师.)他参与了一个网站www.JavaPerformanceTuning.com,它有更多的MBB细节:NIO性能提示和其他Java性能相关的东西.