Matlab:直接/高效地解压缩到内存,以避免缓慢的磁盘交互



给定一个.tar存档,Matlab允许通过UNTAR命令将包含的文件提取到磁盘。然后可以以普通方式操作提取的文件。

问题:当多个文件存储在压缩包中时,它们将连续存储在磁盘上,原则上可以串行访问它们。当提取此类文件时,这种连续性不再成立,文件访问可能会变得随机,因此速度慢且效率低下。

当考虑的文件很多(数千)和小时,这一点尤其重要。

我的问题:有没有办法访问存档文件,避免初步提取(以某种 HDF5 方式)?

换句话说,是否可以缓存.tar以便从内存而不是磁盘访问包含的文件?


(一般来说,直接.tar操作是可能的,例如在python中是C#tar-cs)。

不,据我所知。

如果您在 Linux 上使用 Matlab,请尝试提取到 tmpnam 。这将提取到 tmpfs 应该更快地访问(如果我们占用大约几 GB,这是个坏主意)。

另一种方式,您可以使用system('untar xf file.tar only/needed/file')或python来获得更灵活的解压缩行为。

一段时间后,我终于找到了一个解决方案,给了我令人难以置信的加速(比如 10 倍左右)。

一言以蔽之:ramdisk(在Linux(Ubuntu和CentOs)上测试)。


回顾:

由于这个问题具有一定的普遍性,让我以更完整的方式再次说明。

假设我在磁盘上存储了许多小文件(txt,pict,数百万个),我想对其进行操作(例如通过 matlab)。

当这些文件存储在磁盘上时,处理这些文件(即加载它们/在网络上传输它们)非常,因为磁盘访问大多是随机的。

因此,在我看来,将存档中的文件(例如固定大小的文件)压缩保持磁盘访问顺序的好方法。

问题:

如果.tar的操作需要初步提取到磁盘(就像 matlab 的 UNTAR 一样),顺序磁盘访问给出的速度主要是丢失的。

解决方法:

压缩包(前提是它相当小)可以提取到内存中,然后从那里进行处理。在 matlab 中,正如我在问题中所述,内存中的.tar操作是不可能的。

可以做的(等效地)是untarring虚拟硬盘

在Linux中,例如Ubuntu,默认的虚拟硬盘安装在/run/shmtempfs)。文件可以通过那里的 matlab 解压缩,然后具有极快的访问速度。

换句话说,可能的工作周期是:

  1. untar/run/shm/mytemp
  2. 在内存中操作
  3. 可能再次tar输出到磁盘

这允许我将处理的缩放时间从 8hrs 更改为 40min 和完整的 CPU 负载。

最新更新