高效的文件存储算法

时间:2014-12-11 12:28:27

标签: algorithm file-io storage

我们需要将n个文件f1...fn存储在磁盘上。每个文件fi长度为si <= B个字节,其中一页磁盘存储B个字节。我们可以将每个文件完全存储在页面上,或者在两个连续页面之间拆分。连续文件必须存储在相同或连续的页面上。我们将按顺序访问文件并对每个文件执行计算。每次我们访问一个与前一个文件不完全在同一页面上的新文件时,我们都会有Tpage的开销,用于将页面读入主内存。此外,如果文件fi在两个页面之间拆分,则在计算过程中我们会遇到Tsplit * si的高速缓存未命中的开销。我们希望找到一种有效的算法,用于在内存中存储文件,最大限度地减少总开销时间。

如果该问题及时运行O(nB),则认为该算法的效率很高。

我的方法:

似乎是重新安排文件,以尽量减少缓存未命中。但是,声明说连续文件需要存储在相同或连续的页面中。这意味着我们无法更改顺序以最适合可用页面。但是,由于文件是按顺序读取的,因此在读取数据时我们可以“向前看”以查看我们读取的当前页面是否包含下一个文件。维护文件起点和终点的索引可能有所帮助,以便在读取文件时,我们可以检查它是否包含下一个文件。

有人可以为这个问题建议动态编程算法吗?

1 个答案:

答案 0 :(得分:0)

如果您按顺序布置文件,那么对于每个文件,您需要做出一个决定 - 不管是新页面。

需要权衡:开始新页面通常会产生比拆分更低的成本,但它会让您留下更少的页面,这可能会使未来的决策成本更高。

动态编程解决方案是衡量这些决策的所有可能序列如何影响这种权衡。

设MIN_COST(r,i)是布置第一个i文件的最低成本,同时在最后一页中保留r字节。 MIN_COST(r,i)=无穷大,如果无法布置剩余r个字节的第一个i文件。

MIN_COST(r,1)= 0表示r = B-s0,否则为无穷大

对于每个i&gt; 1,你可以通过简单地从所有r中尝试2个可能的决定(新页面或不是新的),从MIN_COST(r,i-1)的值计算所有MIN_COST(r,i),全部记住每个产生的新余数的新的最低成本。

最后,最低成本布局的成本是MIN_COST(r,n)中最低的。如果您还记得产生每个成本的决策顺序,那么您可以从最小的成本中获取序列并相应地布置文件。

该算法进行N步,每步最多进行2B次恒定时间测试,总运行时间为O(NB)。