大量包含对象的小型.mat文件的高效磁盘访问

4
我正在尝试确定存储大量小的.mat文件的最佳方法,大约有9000个对象,大小从2k到100k不等,总共约半GB。
典型的用例是我每次只需要从磁盘中提取少量文件(比如10个)。
我尝试过以下方法:
方法1:如果我单独保存每个文件,则会出现性能问题(保存时间非常慢,并且在一段时间后系统会变得迟缓),因为Windows 7难以处理太多文件夹中的文件(而且我认为我的SSD也遇到了麻烦)。然而,最终结果很好,我可以非常快地加载所需内容。这使用“-v6”保存。
方法2:如果我将所有文件保存在一个.mat文件中,然后只加载我需要的变量,访问速度非常慢(加载需要的时间约占加载整个文件时间的三分之二,根据保存的顺序而有所不同)。这也使用“-v6”保存。
我知道我可以将文件拆分成许多文件夹,但这似乎是一种不好的解决方案(并且无法解决SSD不喜欢写入许多小文件的问题),有更好的方法吗?
编辑: 这些对象主要由双精度数据的数字矩阵和一个伴随的uint32标识符向量组成,还有一些小的标识属性(char和numeric)。

3个回答

2

考虑以下五个想法:

  1. 尝试将其存储在HDF5对象中-查看http://www.mathworks.com/help/techdoc/ref/hdf5.html -您可能会发现这解决了所有问题。它还与许多其他系统兼容(例如Python,Java,R)。
  2. 您的第二种方法的变化是将它们存储在一个或多个文件中,但关闭压缩功能。
  3. 不同的数据类型:也可能是这样的情况,您有一些对象无法压缩或解压缩。我曾经遇到过这样的问题,要么是单元数组,要么是结构数组。我最终找到了一个解决办法,但已经有一段时间了,我不记得如何重现这个特定的问题。解决方案是使用不同的数据结构。
  4. @SB提出了一个数据库。如果所有其他方法都失败了,请尝试。我不喜欢建立外部依赖和额外的接口,但它应该可以工作(主要问题是如果DB开始呻吟或损坏您的数据,那么您回到原点)。为此,请考虑SQLite,它不需要单独的服务器/客户端框架。 Matlab Central上有一个界面:http://www.mathworks.com/matlabcentral/linkexchange/links/1549-matlab-sqlite
  5. (新)考虑到对象小于1GB,可能更容易将整个集合复制到RAM磁盘中,然后通过RAM磁盘访问。只需记住如果保存了任何内容,则从RAM磁盘复制(或包装 save 以在两个位置保存对象)。

更新:OP提到了自定义对象。有两种序列化这些对象的方法:

  1. 来自Matlab Central的两个序列化程序:http://www.mathworks.com/matlabcentral/fileexchange/29457 -受到启发:http://www.mathworks.com/matlabcentral/fileexchange/12063-serialize
  2. Google的Protocol Buffers。看这里:http://code.google.com/p/protobuf-matlab/

谢谢迭代器。我已经以不压缩的方式保存它们(V6),因为我发现最近的格式往往访问速度较慢,而且通常会导致更大的文件大小(即使使用压缩)。我会看一下HDF5。 - MatlabSorter
Matlab的HDF5实现似乎也不支持自定义对象。 - MatlabSorter
你能描述一下这些对象吗?也许它们可以更快地进行转换和访问。在压缩中,-V7和-V7.3有一个奇怪的问题;对于小于2GB的所有内容,我倾向于使用-V7。我认为大多数最新版本的Matlab使用HDF5,但是某些(全部?)版本在使用中存在已知的错误,导致写入极其缓慢。这就是为什么我倾向于对所有小型文件使用旧格式的原因。 - Iterator

1

尝试将它们存储为数据库中的二进制大对象。

我也会尝试使用多个文件夹的方法 - 它可能比你想象的表现更好。如果您需要组织文件,这也可能有所帮助。


谢谢SB。我找不到在Matlab中序列化自定义对象的方法,所以我仍然需要先保存到磁盘再填充数据库。 - MatlabSorter

0
我想到的解决方案是将每个数组对象保存为大约100个对象。这些文件通常为5-6兆,因此加载不会受到限制,并且访问只是加载正确的数组,然后将其子集到所需条目。这种妥协避免了编写太多小文件,仍然允许快速访问单个对象并避免任何额外的数据库或序列化开销。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接