对包含对象的大量小型 .mat 文件进行高效磁盘访问
Posted
技术标签:
【中文标题】对包含对象的大量小型 .mat 文件进行高效磁盘访问【英文标题】:Efficient disk access of large number of small .mat files containing objects 【发布时间】:2011-10-27 15:07:43 【问题描述】:我正在尝试确定存储大量小型 .mat 文件的最佳方式,大约 9000 个大小从 2k 到 100k 的对象,总共大约半个演出。
典型的用例是我一次只需要从磁盘中提取少量(比如 10 个)文件。
我尝试过的:
方法 1:如果我单独保存每个文件,我会遇到性能问题(保存时间非常慢并且系统在一段时间后运行缓慢),因为 Windows 7 难以处理文件夹中的文件(而且我认为我的 SSD 有这也是一段艰难的时期)。但是,最终结果很好,我可以非常快速地加载我需要的内容。这是使用“-v6”保存。
方法 2:如果我将所有文件保存在一个 .mat 文件中,然后仅加载我需要的变量,则访问速度非常慢(加载时间大约是加载整个文件所需时间的四分之三,很少变化取决于保存的顺序)。这也是使用“-v6”保存。
我知道我可以将文件拆分为多个文件夹,但这似乎是一个令人讨厌的 hack(并且不会解决 SSD 不喜欢写入许多小文件的问题),有没有更好的方法?
编辑: 这些对象主要由一个双精度数据的数字矩阵和一个随附的 uint32 标识符向量以及一堆小的标识属性(字符和数字)组成。
【问题讨论】:
相关问题:MATLAB: Saving several variables to "-v7.3" (HDF5) .mat-files seems to be faster when using the "-append" flag. How come? 【参考方案1】:我想出的解决方案是保存对象数组,每个数组包含大约 100 个对象。这些文件往往是 5-6 兆,因此加载并不令人望而却步,访问只是加载正确的数组,然后将它们子集到所需的条目。这种折衷避免了写入过多的小文件,仍然允许快速访问单个对象并避免任何额外的数据库或序列化开销。
【讨论】:
【参考方案2】:需要考虑的五个想法:
-
尝试存储在 HDF5 对象中 - 看看 http://www.mathworks.com/help/techdoc/ref/hdf5.html - 您可能会发现这可以解决您的所有问题。它还将与许多其他系统(例如 Python、Java、R)兼容。
方法 #2 的一种变体是将它们存储在一个或多个文件中,但要关闭压缩。
不同的数据类型:也可能是某些对象的压缩或解压缩效果非常差。我在单元格数组或结构数组中遇到过这样的问题。我最终找到了解决方法,但已经有一段时间了,我不记得如何重现这个特定问题。解决方案是使用不同的数据结构。
@SB 提出了一个数据库。如果一切都失败了,试试那个。我不喜欢构建外部依赖项和额外的接口,但它应该可以工作(主要问题是如果数据库开始抱怨或破坏你的数据,那么你又回到了第 1 格)。为此,请考虑 SQLite,它不需要单独的服务器/客户端框架。 Matlab Central 上有一个可用的接口:http://www.mathworks.com/matlabcentral/linkexchange/links/1549-matlab-sqlite
(新)考虑到对象小于 1GB,将整个集合复制到 RAM 磁盘然后通过它访问可能更容易。如果保存了任何内容,请记住从 RAM 磁盘复制(或包装
save
以将对象保存在两个位置)。
更新:OP 提到了自定义对象。有两种方法可以考虑对它们进行序列化:
-
来自 Matlab Central 的两个序列化程序:http://www.mathworks.com/matlabcentral/fileexchange/29457 - 灵感来自:http://www.mathworks.com/matlabcentral/fileexchange/12063-serialize
Google 的协议缓冲区。看这里:http://code.google.com/p/protobuf-matlab/
【讨论】:
感谢迭代器。我已经在不压缩(V6)的情况下保存它们,因为我发现更新的格式往往访问速度较慢,并且通常会导致更大的文件大小(即使压缩)。我来看看 HDF5。 Matlab 的 HDF5 实现似乎也不支持自定义对象。 你能描述一下这些对象吗?可能是它们可以更快地转换和访问。压缩时-V7和-V7.3有一个奇怪的地方;对于 2GB 以下的所有内容,我倾向于使用 -V7。我认为最新版本的 Matlab 使用 HDF5,但某些(全部?)版本在使用中存在已知错误,导致写入速度极慢。这就是为什么我倾向于对所有小的东西使用旧格式。【参考方案3】:尝试将它们作为 blob 存储在数据库中。
我也会尝试使用多文件夹方法 - 它的性能可能比您想象的要好。如果您需要,它也可能有助于组织文件。
【讨论】:
谢谢 SB。我找不到在 Matlab 中序列化自定义对象的方法,所以在填充数据库之前我仍然需要保存到磁盘。以上是关于对包含对象的大量小型 .mat 文件进行高效磁盘访问的主要内容,如果未能解决你的问题,请参考以下文章