Performance 重量和性能方面的最佳数据存储格式(如Txt、Asc、Bin等)?

Performance 重量和性能方面的最佳数据存储格式(如Txt、Asc、Bin等)?,performance,format,Performance,Format,有人能指导我找到读/写速度、性能、重量(文件大小)方面的最佳存储格式,以便将重矩阵(具有恒定精度的浮点数)存储到文件(到硬盘)中 我一直在使用ASCII、文本和二进制格式。比如说,对于相同的矩阵大小(例如10000x1000x200)和数字精度(例如5位有效数字),我发现二进制格式总体上给出了最好的结果,然后是ASCII和文本的存取/写入速度和权重(我没有做任何实际测试) 话虽如此,在我的情况下,有没有比二进制更好的标准数据存储格式?如果没有,是否有任何方法可以优化数据结构以在保存/读取时获得更

有人能指导我找到读/写速度、性能、重量(文件大小)方面的最佳存储格式,以便将重矩阵(具有恒定精度的浮点数)存储到文件(到硬盘)中

我一直在使用ASCII、文本和二进制格式。比如说,对于相同的矩阵大小(例如10000x1000x200)和数字精度(例如5位有效数字),我发现二进制格式总体上给出了最好的结果,然后是ASCII和文本的存取/写入速度和权重(我没有做任何实际测试)

话虽如此,在我的情况下,有没有比二进制更好的标准数据存储格式?如果没有,是否有任何方法可以优化数据结构以在保存/读取时获得更好的性能


我可以使用C、C++或MATLAB(不管我是哪一个),如果能帮助达到更好的结果。如果使用浮点数,则每个数字使用4个字节,而不是数字的每个字符使用1个字节-因此数字5.34182是4个字节,而不是7个字节加一个分隔符

不过,再往前走,你可能会做得更好。您的磁盘不会逐字节读取数据,而是读取数据,通常您希望避免读取的数据块过多。二进制格式更快的真正原因不是它占用更少的字节,而是它占用更少的块(占用更少字节的产物)。这意味着您希望最小化磁盘上的大小,因为从磁盘读取比从RAM读取慢一个数量级—磁盘访问以毫秒为单位,而RAM访问以微秒为单位

那么现在你能做什么呢?如果矩阵为,则可以只存储非零元素,这将节省大量空间。因此,不是存储每个点,而是为每个条目存储一对(索引、值)。这意味着每个条目现在是8字节而不是4字节,但如果矩阵的一半以上为零,则可以节省大量空间


最后,压缩在这里有很大帮助。当然,更多的压缩意味着更多的CPU时间来解压缩矩阵,但也可能意味着更快的磁盘读取。在这里,你真的必须进行实验——在这个范围的简单一端,它很容易实现,并且通常工作得出奇地好。这是因为如果存储的是小整数和“简单”浮点,则大部分字节都是零。如果相同的数字重复多次,这也很有效,这在矩阵中确实发生。我还建议检查更高级的方案,例如,虽然计算更复杂,但可以显著减少磁盘上的大小。唉,压缩往往是非常领域特定的,所以您必须在这里进行实验。在一个领域有效的东西并不总是在另一个领域有效。

复杂的问题。许多人都在图书馆里把效率和易用性和互换性结合在一起——你考虑过类似的事情吗?这两个工具都有C/C++访问库,以及到常用工具(如Matlab、Python、R等)的绑定


也就是说,我过去也写过一次性的二进制储存器

是的,64mb的磁盘缓存对我的帮助不大

不幸的是,我使用的是非常密集的矩阵(具有强绑定的有限元素),而精度有限的二进制文件在读/写速度和文件大小(更轻)方面似乎提供了最好的性能,而不可能进行压缩

与二进制文件相比,文本格式文件的大小要大得多,但压缩后的文件大小与二进制文件相同,但需要相当长的压缩时间。读/写时间也非常长

对于3000x3000(单个):二进制(68Mb)读/写时间为:0.05/0.23s,文本(145Mb)读/写时间为13.8/6.5s。 对于6000x6000(单个):二进制(274Mb)读/写时间为:0.22/0.92s,对于文本(583Mb),读/写时间为56/26s。但是,这些值可能不准确,因为硬盘可能是我的一个重要限制因素


使用相同的精度(不同的组合)、相同的矩阵大小(3000x3000、6000x6000、12000x12000)和相同的CPU亲和力,并使用标准的Matlab、Fread和Fscanf进行测试。我无法获得更高的大小/精度,因为HDD读/写速度有限,CPU处于边界线。

重量/性能:二进制。可访问性:文本。压缩对于慢速存储(即磁带驱动器或网络共享)来说是一个胜利,但不太可能跟上现代本地硬盘的速度,尤其是在操作系统磁盘缓存开始运行时。@BenVoigt:我不同意,至少部分不同意。很多常用的矩阵都是高度可压缩的,即使使用智能硬盘,如果你能得到显著的压缩(即在一个巨大的、非常稀疏的矩阵中),你仍然可以看到巨大的收益。32mb的磁盘缓存只能存储一个4字节的原始3000x3000矩阵,而且——承认我对现代磁盘缓存一无所知——我觉得如果你的大小是磁盘缓存大小的几倍,你会看到很大的减速。@mdkess:在极度稀疏的情况下,你根本不想解压缩它,但处理起来很稀疏。现代操作系统经常使用千兆字节的RAM作为磁盘缓存。非常感谢您的快速重播。对于大文件(>1Gb),HDF5似乎是首选。因为我不确定我的文件是否会有那个大小,所以我会做一些测试。另一件我不清楚的事情,你能告诉我HDF5是基于还是实际上是二进制格式的吗-Thanks@Maiss:所有格式最终都是二进制格式,并在顶部添加了某种结构。HDF不使用ASCII字符来编码数字数据,从这个角度来看,它更像是二进制格式,而不是文本格式。