1

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

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

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

我的问题:有什么方法可以访问存档文件,避免初步提取(以一种 HDF5 方式)?

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


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

4

2 回答 2

1

不,据我所知。

如果您在 Linux 上使用 Matlab,请尝试解压到tmpnam. 这将提取到 tmpfs 并且应该可以更快地访问(如果我们要处理大约几个 GB,这是个坏主意)。

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

于 2013-09-14T20:03:48.293 回答
0

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

总之:ramdisk(在 Linux(Ubuntu 和 CentOs)上测试)。


回顾:

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

假设我有许多存储在磁盘上的小文件(txt、pict、数百万的顺序),我想操作它们(例如通过 matlab)。

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

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

问题:

如果操作.tar需要对磁盘进行初步提取(就像 matlab 的情况一样UNTAR),则顺序磁盘访问所提供的加速主要是损失。

解决方法:

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

可以做的(等效地)是untarringramdisk

在 linux(例如 Ubuntu)中,默认的 ramdisk 驱动器安装在/run/shm( tempfs) 中。文件可以在那里通过 matlab 解压,然后访问速度极快。

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

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

这使我可以将处理的缩放时间从8hrs40min满 CPU 负载。

于 2013-09-25T09:54:33.170 回答