Filesystems 如何预测ISO 9660文件系统的大小?

Filesystems 如何预测ISO 9660文件系统的大小?,filesystems,dvd-burning,iso9660,Filesystems,Dvd Burning,Iso9660,我正在将数据归档到DVD,我想将DVD全部打包。我知道DVD上我想要的所有文件的名称和大小,但我不知道元数据占用了多少空间。我想在每张DVD上获得尽可能多的文件,所以我使用了贪心装箱的泡泡搜索启发式方法。我尝试了10000种选择,得到了最好的一种。目前我知道所有文件的大小,因为我不知道文件是如何存储在ISO9660文件系统中的,所以我为元数据添加了很多slop。我想把斜坡削下来 我可以使用genisoimage-print size但速度太慢了,因为40000个文件占用500MB,大约需要3秒钟

我正在将数据归档到DVD,我想将DVD全部打包。我知道DVD上我想要的所有文件的名称和大小,但我不知道元数据占用了多少空间。我想在每张DVD上获得尽可能多的文件,所以我使用了贪心装箱的泡泡搜索启发式方法。我尝试了10000种选择,得到了最好的一种。目前我知道所有文件的大小,因为我不知道文件是如何存储在ISO9660文件系统中的,所以我为元数据添加了很多slop。我想把斜坡削下来

我可以使用
genisoimage-print size
但速度太慢了,因为40000个文件占用500MB,大约需要3秒钟。每张DVD拍8个小时是不可能的。我以前修改过
genisoimage
源代码,我真的不想从源代码中挤出算法;我希望有人知道一个更好的方法来得到一个估计,或者可以告诉我一个有用的规格


澄清问题和问题:

  • 我需要刻录分割成多张DVD的档案,通常一次刻录五张左右。我试图解决的问题是决定在每张DVD上放哪些文件,以便每张DVD(最后一张除外)都尽可能满。这个问题是NP难问题

  • 我使用的是标准的贪婪打包算法,你把最大的文件放在第一张有足够空间的DVD里。所以j_random_hacker,我绝对不是从random开始的。我从排序开始,使用Bubblesearch来扰乱文件的打包顺序。此程序将我的包装从估计容量的80%左右提高到99.5%以上。这个问题是关于如何更好地估计容量的问题;目前我估计的容量低于实际容量

  • 我编写了一个程序,尝试10000次扰动,每个扰动包括两个步骤:

  • 选择一组文件
  • 估计这些文件在DVD上会占用多少空间
  • 第二步是我努力改进的步骤。目前,正如泰勒D所说,我“在谨慎方面犯了错误”。但我想做得更好。我不能使用
    genisomage-print size
    ,因为它太慢了。类似地,我不能将文件tar到磁盘,因为on-only太慢,但是tar文件的大小与iso9660图像的大小不同。这是我需要预测的ISO9660图像的大小。原则上这可以完全准确地完成,但我不知道怎么做。这就是问题所在


注意:这些文件位于硬盘存储容量为3TB的机器上。在所有情况下,文件的平均大小至少为10MB;有时它要大得多。因此,
genisomage
毕竟可能足够快,但我对此表示怀疑——它似乎是通过将ISO映像写入/dev/null来工作的,我无法想象当映像大小接近4.7GB时会足够快。我现在没有访问那台机器的权限,或者当我发布原始问题时。当我晚上有机会的时候,我会尽量为这个问题找到更好的答案。但我不认为
genisomage
是一个好的解决方案——尽管它可能是学习文件系统模型的一个好方法 这告诉我它是如何工作的。知道块大小是2KB已经很有帮助了


了解同一目录中的文件被刻录到samae DVD也可能很有用,这简化了搜索。我想直接访问文件,这就排除了烧录前的焦油。(大多数文件都是音频或视频文件,这意味着用
gzip
点击它们毫无意义)

不能使用tar将文件存储在磁盘上吗? 现在还不清楚您是在编写一个程序来实现这一点,还是只是在做一些备份

也许做一些实验,犯一些谨慎的错误——磁盘上的一些可用空间不会有什么坏处


不知怎的,我想你已经考虑过了,或者我的答案没有抓住要点。

我不确定你目前是怎么做的——根据我的谷歌搜索,“泡泡搜索”指的是一种选择某种意义上近乎贪婪排序的项目排序的方法,但在你的情况下,将文件添加到DVD的顺序不会改变空间要求,因此这种方法会浪费时间考虑多个不同的顺序,这些顺序相当于相同的文件集

换句话说,如果您正在执行以下操作以生成候选文件列表:

  • 随机洗牌文件列表
  • 从列表的顶部开始,贪婪地选择所有你估计适合DVD的文件,直到没有更多的文件
  • 然后,您正在低效地搜索解决方案空间——对于任何最终的候选集n个文件,您可能会考虑所有n个!制作那一套的方法。我的建议是:

  • 按文件大小的降序对所有文件进行排序
  • 将顶部(最大)文件标记为“包含”,并将其从列表中删除。(它必须包含在某些DVD中,因此我们不妨现在就包含它。)
  • 如果ISO文件系统大小(估计)不超过DVD容量,是否可以包括列表中最顶层的文件?如果是:
    • 使用概率p(例如p=0.5),将文件标记为“包含”
  • 从列表中删除最上面的文件
  • 如果列表现在为空,则有一个候选文件列表。否则,转到3
  • 重复多次,然后选择最佳文件列表


    Tyler D的建议也很好:如果您有大约40000个文件,总计约500Mb,这意味着平均文件大小为12.5Kb。ISO9660使用了2Kb的块大小,这意味着这些文件平均浪费了1Kb的磁盘空间,约占其大小的8%。因此,首先将它们与tar一起打包将节省大约8%的空间。

    感谢详细的更新。我是
    174 + floor(count / 42) + sum( ceil(file_size / 2048) )
    
    #!/usr/bin/perl -w
    use strict;
    use POSIX;
    
    sub sum {
        my $out = 0;
        for(@_) {
            $out += $_;
        }
        return $out;
    }
    
    my @sizes = ( 2048 ) x 1000;
    my $file_count = @sizes;
    
    my $data_size = sum(map { ceil($_ / 2048) } @sizes);
    my $dir_size = floor( $file_count / 42 ) + 1;
    my $overhead = 173;
    
    my $size = $overhead + $dir_size + $data_size;
    
    $\ = "\n";
    print $size;