我正在将数据存档到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次扰动的程序,每个程序包含两个步骤:
选择一组文件
估计这些文件在DVD上占用多少空间
第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
.)