C 就地重新排列文件的内容

C 就地重新排列文件的内容,c,archive,in-place,C,Archive,In Place,我正在尝试优化一种在节点中存储数据的归档格式。随着时间的推移,容器变得杂乱无章(小的不可用的“空闲”空间节点不断累积等)。我所做的类似于碎片整理。我已经有了所有数据位置的列表,以及我希望数据处于最终状态的位置表示,但我正在努力将实际数据从当前配置移动到最佳配置。这些元素的大小不同,也不是任何最小块的倍数(除非计算字节)。有什么明显的方法我忽略了吗?我甚至不知道搜索算法时这个问题叫什么,我得到的最接近的是就地排序 到目前为止,我已经尝试交换数据块,但我需要跟踪节点片段,这变得太混乱,不可行 我不想

我正在尝试优化一种在节点中存储数据的归档格式。随着时间的推移,容器变得杂乱无章(小的不可用的“空闲”空间节点不断累积等)。我所做的类似于碎片整理。我已经有了所有数据位置的列表,以及我希望数据处于最终状态的位置表示,但我正在努力将实际数据从当前配置移动到最佳配置。这些元素的大小不同,也不是任何最小块的倍数(除非计算字节)。有什么明显的方法我忽略了吗?我甚至不知道搜索算法时这个问题叫什么,我得到的最接近的是就地排序

到目前为止,我已经尝试交换数据块,但我需要跟踪节点片段,这变得太混乱,不可行


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

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


如果可用的磁盘空间是一个问题,你会有一个有趣的时间在你面前,因为这将需要一些精湛的黑客技能,以获得快速。我认为,最好的办法是分配大量缓冲区内存,并在文件中维护一个漏洞列表,该文件的数据位于该缓冲区内。然后从文件开头开始,用所有不合适的东西填充缓冲区。一旦缓冲区已满,您可以将数据从任何位置复制到孔中,并在填充孔的末尾将数据继续推入缓冲区。无论何时缓冲区空间用完,都需要跳转可用的最大洞,并移动属于该洞的数据。正如我所说的,这并不容易,但可能会很有趣……

因为归档文件在文件系统上,文件系统不是会自动在数据上设置单词边界吗?我想问的是,这些小的不可用的“空闲”空间节点不是因为文件系统造成的边界吗,不是因为实际的归档程序吗?不,格式不是很低,它字面上是一个头,然后是二进制数据,空闲空间由一个长度和一个听起来有趣的标记free标记。只要缓冲区中没有被无处可移动的数据填充。我想如果需要的话,我可以用一个临时文件来替换缓冲区,它永远不会接近完整文档的大小。您还可以在“压缩”可用空间时将缓冲区内容附加到文件的末尾。一旦达到原始EOF,您可以截断剩余的可用空间或留作将来使用。我怀疑是否值得花时间将缓冲区写入文件,因为这将意味着更多的磁盘访问。使用我上面概述的算法,您只需要读取和写入每个字节一次。如果使用临时文件,则会增加到原来的两倍。一开始它可能看起来也一样快,因为现代系统会静默地缓冲临时文件,但无论如何这都是额外的操作。当然,你可以试着证明我错了…:-)啊,是的,没错。我将尝试为每个被替换的项分配一个单独的内存块,以避免一次只占用一个巨大的缓冲区。我不想决定大缓冲区应该有多大=P。然后,当项目移出“缓冲区”时,我可以释放块。我看到动态分配内存的方法有两个危险,尽管我通常支持malloc:1)我担心堆碎片。平均而言,您的应用程序将使用大约两倍于您认为正在使用的内存,但是错误的malloced大小序列可能会使堆无限增长,从而将系统推入内存不足的情况。2) 杀手。我不知道Windows,但Linux有一个习惯,就是在内存不足时疯狂地运行进程。如果您的程序发生这种情况,结果将是一个损坏的文件。