4

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

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

我试过的:

方法 1:如果我单独保存每个文件,我会遇到性能问题(保存时间非常慢并且系统在一段时间后运行缓慢),因为 Windows 7 难以处理,因此文件夹中的文件可能会出现(而且我认为我的 SSD 过得不好)也是)。但是,最终结果很好,我可以非常快速地加载我需要的内容。这是使用“-v6”保存。

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

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

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

4

3 回答 3

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 磁盘然后通过它访问可能更容易。save如果保存了任何内容(或包装以将对象保存在两个位置),请记住从 RAM 磁盘复制。

更新: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/
于 2011-08-15T22:09:22.560 回答
1

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

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

于 2011-08-15T22:01:36.723 回答
0

我想出的解决方案是保存大约 100 个对象的对象数组。这些文件往往是 5-6 兆,因此加载并不令人望而却步,访问只是加载正确的数组,然后将它们子集到所需的条目。这种折衷避免了写入过多的小文件,仍然允许快速访问单个对象并避免任何额外的数据库或序列化开销。

于 2011-08-16T17:58:51.657 回答