Nor*_*sey 6 filesystems dvd-burning iso9660
我正在将数据存档到DVD,我想要将DVD打包完整.我知道DVD上我想要的所有文件的名称和大小,但我不知道元数据占用了多少空间.我想在每张DVD上获得尽可能多的文件,所以我使用了一个带有贪婪的bin-packing的Bubblesearch启发式算法.我尝试了10,000种替代方案并获得最佳选择.目前我知道所有文件的大小,因为我不知道文件如何存储在ISO 9660文件系统中,我为元数据添加了大量的slop.我想减少污泥.
我可以使用,genisoimage -print-size但它太慢了 - 假设40,000个文件占用500MB,大约需要3秒钟.每张DVD需要8小时不在卡片中.我以前修改了genisoimage源代码,我真的不想尝试从源代码中挤出算法; 我希望有人知道更好的估算方法,或者可以指出一个有用的规范.
澄清问题和问题:
我需要刻录分成多张DVD的档案,通常一次大约五张.我试图解决的问题是决定将哪些文件放在每张DVD上,以便每张DVD(除了最后一张)尽可能充分.这个问题是NP难的.
我正在使用标准的贪婪打包算法,您首先放置最大的文件,然后将其放入第一张有足够空间的DVD中.所以j_random_hacker,我绝对不是从随机开始的.我从排序开始并使用Bubblesearch来扰乱文件的打包顺序.此程序将我的包装从估计容量的约80%提高到估计容量的99.5%以上.这个问题是关于更好地估计容量 ; 目前我估计的容量低于实际容量.
我编写了一个尝试10,000次扰动的程序,每个程序包含两个步骤:
第2步是我正在努力改进的步骤.正如Tyler D所暗示的那样,目前我正在"谨慎行事".但我想做得更好.我买不起,genisomage -print-size因为它太慢了.同样,我不能将文件tar到磁盘,因为它只是太慢,但tar文件与ISO 9660图像的大小不同.这是我需要预测的ISO 9660图像的大小.原则上这可以完全准确地完成,但我不知道该怎么做.这就是问题所在.
注意:这些文件位于具有3TB硬盘存储空间的计算机上.在所有情况下,文件的平均大小至少为10MB; 有时候它会大得多.所以有可能genisomage毕竟会足够快,但我怀疑它 - 似乎通过将ISO映像写入/ dev/null来工作,我无法想象当图像大小接近时它会足够快4.7GB.我现在无法访问该计算机,或者当我发布原始问题时.当我确实在晚上访问时,我会尝试获得更好的数字.但我认为这不是genisomage一个好的解决方案 - 虽然它可能是学习文件系统模型的好方法,它告诉我它是如何工作的.知道块大小为2KB已经很有帮助.
知道同一目录中的文件被刻录到samae DVD也很有用,这简化了搜索.我希望直接访问这些文件,这会排除tar-before-burning.(大多数文件都是音频或视频,这意味着尝试使用它们没有意义gzip.)
感谢您的详细更新。我很满意您当前的装箱策略非常有效。
至于问题,“对于总共b字节的n 个文件, ISO 9660 文件系统到底需要多少开销?” 只有两个可能的答案:
其实,还有第三种答案:
(3) 您并不真正关心使用每张 DVD 上的最后一个字节。在这种情况下,抓取一小部分具有不同大小(例如 5 个)的代表性文件,将它们填充到 2048 字节的倍数,然后将所有 2^5 个可能的子集放入genisoimage -print-size. 然后在该数据集上拟合方程nx + y = iso_size -total_input_size ,其中n = 给定运行中的文件数,以找到x 和 y,其中 x是每个文件的开销字节数,y是常量开销(不包含文件的 ISO 9660 文件系统的大小)。将x和y向上取整并使用该公式来估计给定文件集的 ISO 文件系统大小。为了安全起见,请确保使用集合中任何位置出现的最长文件名作为测试文件名,并将每个文件放在一个单独的目录层次结构下,该目录层次结构与集合中最深的层次结构一样深。