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

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

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

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

我尝试过的:

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

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

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

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

最佳答案

要考虑的五个想法:

  1. 尝试存储在 HDF5 对象中 - 查看 http://www.mathworks.com/help/techdoc/ref/hdf5.html - 您可能会发现这可以解决您所有的问题。它还将与许多其他系统(例如 Python、Java、R)兼容。
  2. 方法 2 的一种变体是将它们存储在一个或多个文件中,但关闭压缩。
  3. 不同的数据类型:也可能是您有一些压缩或解压缩莫名其妙地糟糕的对象。我在使用元胞数组或结构数组时遇到过此类问题。我最终找到了解决方法,但是已经有一段时间了,我不记得如何重现这个特定问题。解决方案是使用不同的数据结构。
  4. @SB 提出了一个数据库。如果一切都失败了,那就试试吧。我不喜欢构建外部依赖项和额外的接口(interface),但它应该可以工作(主要问题是如果数据库开始提示或破坏您的数据,那么您将回到第 1 个方 block )。为此考虑 SQLite,它不需要单独的服务器/客户端框架。 Matlab Central 上有一个可用的接口(interface):http://www.mathworks.com/matlabcentral/linkexchange/links/1549-matlab-sqlite
  5. (新)考虑到对象小于 1GB,将整个集合复制到 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 Buffer 。看这里:http://code.google.com/p/protobuf-matlab/

关于matlab - 大量包含对象的小 .mat 文件的高效磁盘访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071305/

相关文章:

java - 如何使用 JAVA 在 MATLAB 中进行显式多线程处理?

arrays - 如何在 MATLAB 中找到 3D 数组每个切片的最大值和位置?

matlab - 将巨大的二进制文件部分加载到Matlab中

matlab - 错误类型为 'min'的输入参数的未定义函数或方法 'struct'

c++ - 将 matlab 数组(MAT 文件)转换为 C++ 数组

matlab - 无阴影一维不变图像的实现

matlab - 在 Matlab 中查找行中的最小值并计算每列中最小值的总数

c# - WPF C#,从音频文件中获取信息

使用 mmap 将整个文件复制到内存中

c# - 使用 File.Create() 后另一个进程正在使用的文件