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

Matlab 对包含对象的大量小型.mat文件的高效磁盘访问,matlab,file-io,mat-file,matlab-load,Matlab,File Io,Mat File,Matlab Load,我正在尝试确定存储大量小型.mat文件的最佳方法,大约9000个对象,大小从2k到100k不等,总共大约需要半个gig 典型的用例是,我一次只需要从磁盘中取出少量(比如10个)文件 我所尝试的: 方法1:如果我单独保存每个文件,我会遇到性能问题(非常慢的保存时间和一段时间后的系统停滞),因为Windows 7很难处理文件夹中的文件(我认为我的SSD也很难处理)。但是,最终结果很好,我可以很快加载我需要的内容。这是使用'-v6'保存 方法2:如果我将所有文件保存在一个.mat文件中,然后只加载所需

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

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

我所尝试的:

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

方法2:如果我将所有文件保存在一个.mat文件中,然后只加载所需的变量,则访问速度非常慢(加载整个文件所需的时间约为加载整个文件所需时间的四分之三,根据保存的顺序变化很小)。这也在使用“-v6”保存

我知道我可以将文件分割成许多文件夹,但这似乎是一个令人讨厌的黑客行为(并且无法解决SSD不喜欢编写许多小文件的问题),有更好的方法吗

编辑:
这些对象主要由一个双数据的数字矩阵和一个uint32标识符的伴随向量,以及一组小的标识属性(字符和数字)组成。

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


我也会尝试多文件夹方法——它的性能可能比你想象的要好。如果您需要的话,它还可以帮助您组织文件。

需要考虑的五个想法:

  • 尝试存储在HDF5对象中-看看-您可能会发现这解决了所有问题。它还将与许多其他系统兼容(例如Python、Java、R)
  • 方法2的一个变体是将它们存储在一个或多个文件中,但关闭压缩
  • 不同的数据类型:也可能是某些对象的压缩或解压效果令人费解。我在单元格数组或结构数组中遇到过这样的问题。我最终找到了解决这个问题的方法,但已经有一段时间了&我不记得如何重现这个特殊的问题。解决方案是使用不同的数据结构
  • @某人提议建立一个数据库。如果其他方法都失败了,那就试试吧。我不喜欢构建外部依赖关系和附加接口,但它应该可以工作(主要问题是,如果数据库开始呻吟或破坏您的数据,那么您就回到了第一步)。为此,考虑SQLite,它不需要单独的服务器/客户机框架。Matlab Central上有一个可用的接口:
  • (新增)考虑到对象小于1GB,只需将整个集合复制到RAM磁盘,然后通过该磁盘进行访问可能会更容易。如果保存了任何内容,请记住从RAM磁盘复制(或包裹
    save
    将对象保存在两个位置)
  • 更新:OP提到了自定义对象。序列化这些方法有两种方法:

  • Matlab Central的两个序列化程序:-其灵感来自:
  • 谷歌的协议缓冲区。请看这里:

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

    谢谢迭代器。我已经在不进行压缩(V6)的情况下保存了它们,因为我发现较新的格式往往访问速度较慢,并且通常会导致较大的文件大小(即使使用压缩)。我来看看HDF5。Matlab的HDF5实现似乎也不支持自定义对象。你能描述一下这些对象吗?在这种情况下,可以更快地转换和访问它们。在压缩过程中,-V7和-V7.3有一个奇怪的地方;对于2GB以下的所有内容,我倾向于使用-V7。我认为Matlab的最新版本使用HDF5,但是一些(所有?)版本在使用中有一个已知的错误,导致编写速度极慢。这就是为什么我倾向于使用旧的格式来处理所有小的东西。我找不到在Matlab中序列化自定义对象的方法,因此在填充数据库之前,我仍然需要保存到磁盘。相关问题: