我正在将数据存档到 DVD,并且我想将 DVD 打包完整。我知道 DVD 上所有我想要的文件的名称和大小,但我不知道元数据占用了多少空间。我想在每张 DVD 上获取尽可能多的文件,所以我使用了带有贪婪装箱的 Bubblesearch 启发式算法。我尝试了 10,000 种替代方法,并获得了最好的一种。目前我知道所有文件的大小,因为我不知道文件是如何存储在 ISO 9660 文件系统中的,所以我为元数据添加了很多内容。我想减少污水。
我可以使用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
。)