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

时间:2011-08-15 21:58:56

标签: matlab file-io mat-file matlab-load

我正在尝试确定存储大量小型.mat文件的最佳方法,大约9000个对象,大小从2k到100k,总共大约半场演出。

典型的用例是我只需要一次从磁盘中提取少量(例如10个)文件。

我尝试了什么:

方法1:如果我单独保存每个文件,我会遇到性能问题(非常慢的保存时间和系统迟缓一段时间后),因为Windows 7难以处理,所以文件夹中的文件可能(我认为我的SSD有这也很艰难。)但是,最终结果很好,我可以很快加载我需要的东西。这是使用'-v6'保存。

方法2:如果我将所有文件保存在一个.mat文件中,然后仅加载我需要的变量,则访问速度非常慢(加载大约需要四分之三的时间来加载整个文件,变化取决于保存的顺序)。这也是使用'-v6'保存。

我知道我可以将文件拆分成许多文件夹,但它看起来像是一个讨厌的黑客(并且不会修复SSD不喜欢编写许多小文件),有更好的方法吗?

编辑: 这些对象主要由双数据的数字矩阵和uint32标识符的附带向量以及一堆小的标识属性(char和numeric)组成。

3 个答案:

答案 0 :(得分:2)

要考虑的五个想法:

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

    1. 来自Matlab Central的两个序列化程序:http://www.mathworks.com/matlabcentral/fileexchange/29457 - 灵感来自:http://www.mathworks.com/matlabcentral/fileexchange/12063-serialize
    2. Google的协议缓冲区。看看这里:http://code.google.com/p/protobuf-matlab/

答案 1 :(得分:1)

尝试将它们作为blob存储在数据库中。

我也会尝试多个文件夹方法 - 它可能比你想象的要好。如果你需要的话,它也可能有助于组织文件。

答案 2 :(得分:0)

我提出的解决方案是保存大约100个对象的对象数组。这些文件往往是5-6 meg,因此加载不是禁止的,访问只是加载正确的数组然后将它们子集化到所需的条目。这种妥协避免了编写太多小文件,仍允许快速访问单个对象,并避免任何额外的数据库或序列化开销。