【问题标题】:Matlab: direct/efficient untar to memory to avoid slow disk interactionsMatlab:直接/高效解压到内存以避免缓慢的磁盘交互
【发布时间】:2013-09-14 16:24:50
【问题描述】:

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

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

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

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

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


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

【问题讨论】:

  • MATLAB的untar函数是基于Java的,所以如果你找到实现内存解压的Java库,或许可以在MATLAB中使用
  • ok 查看实现 (edit untar.m),您可以修改它(或制作自己的版本)以将输出写入字节流而不是文件流(所有 Java API)。 .

标签: matlab archive tar disk-access


【解决方案1】:

没有,据我所知。

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

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

【讨论】:

    【解决方案2】:

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

    一句话:ramdisk(在 Linux(Ubuntu 和 CentOs)上测试)。


    回顾:

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

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

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

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

    问题:

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

    解决方法:

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

    可以做的(等效)是 untarring 到 ramdisk

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

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

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

    这使我可以将处理的缩放时间从 8hrs 更改为 40min 并加载完整的 CPU。

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2016-06-12
      • 2017-11-19
      相关资源
      最近更新 更多