2013-06-12 183 views
0

我试图优化存储数据在节点中的存档格式。随着时间的推移,容器变得混乱(小的不可用的“空闲”空间节点积聚等)。我正在做的是类似于碎片整理。我已经有了所有数据位置的列表,并且表示了我希望数据处于最终状态的位置,但是我正在努力完成将实际数据从当前配置移动到最佳配置的任务。元素的大小和大小并不相同(除非您计算字节数)。有一些我可以忽略的明显方法吗?我甚至不知道这个问题被称为搜索算法,最近我得到了就地排序。重新排列文件的内容

到目前为止,我尝试交换数据块,但我需要跟踪节点片段,并且它变得太混乱而不可行。

我不想诉诸写一个临时副本,然后替换,因为这些文件非常大。

+0

由于存档位于文件系统上,因此文件系统不会自动为该数据自动设置单词边界吗?我问的是,由于文件系统造成的边界,而不是那些小的不可用的“空闲”空间节点,而不是实际上存档器? – Magn3s1um

+0

不,这个格式不是那么低级的,它的字面意思是一个标题,然后是二进制数据,并且可用空间用长度标记,而标记FREE – mcu17818

回答

0

关于性能,将数据复制到新文件很可能是最佳选择。

如果可用的磁盘空间是一个问题,你有一个有趣的时间在你面前,因为这需要一些精美的黑客技能来获得快速。我认为,最好的办法是分配一大片缓冲区内存,并在数据驻留在此缓冲区内的文件中保留一个空洞列表。然后你开始填充这个缓冲区,从文件的开头开始,不合适的地方。一旦缓冲区满了,您可以将数据从任何位置复制到洞中,并在填充的洞的末尾继续将数据推入缓冲区。每当你用完缓冲区空间时,你需要跳过最大的可用空间并移动那里的数据。正如我所说,这并不容易,但它可能很有趣...

+0

听起来很有趣。只要缓冲区没有填充无处移动的数据。我想我可以用临时文件替换缓冲区,如果需要的话,它不应该接近完整文件的大小 – mcu17818

+0

当你“压缩”可用空间时,你还可以将缓冲区内容追加到文件末尾。一旦达到原始EOF,就可以截断剩余的空闲空间或留下供将来使用。 – Ioan

+0

我怀疑将缓冲区写入文件是值得的,因为这意味着更多的磁盘访问。使用上面概述的算法,您只需要读取和写入每个字节一次。如果您使用临时文件,则会增加到两次。它可能看起来就像一开始一样快,因为现代系统会默默地缓冲你的临时文件,但无论如何它是额外的操作。当然,你总是可以试着证明我错了...... :-) – cmaster