2010-04-05 47 views
2

我想將一個目錄及其下的兩個文件複製到共享存儲的另一個共享位置。是否有可能將三個(一個目錄和兩個文件)作爲連續文件寫入,並在另一側分解以節省成本?我僅限於c語言和Unix/Linux。我正在考慮用inode信息創建一個結構,並在接收器處獲取數據。整個目錄的有效副本

謝謝!

+2

爲什麼不使用'cp -r'? – 2010-04-05 03:15:23

+0

我正在使用C語言編寫的分佈式系統上工作,在這篇文獻中,性能非常關注。 – 2010-04-05 03:21:37

+1

你的意思是把一壺水倒進另一杯水嗎? – 2010-04-05 03:24:58

回答

5

rsync是你在找什麼。或者如果你覺得像在另一邊的殼一起工作焦油。

0

您可以做的最佳優化是使用大型緩衝區進行復制。如果這還不夠,那麼將數據重組爲一個文件而不是目錄中的兩個文件。下一步是獲得更快的硬件。

Unix/Linux常用的文件系統有很多,你需要爲每個文件系統編寫一個自定義的複製算法。即使是單個文件也很少保證連續的塊,更不用說兩個了。賠率也很好,你的塊拷貝例程會繞過並比現有的文件系統優化效率低。

在寫出文件之前將整個文件讀入內存將使尋找時間最小化比打開更少的文件更有利,至少對於超過一定大小的文件。並不是所有的硬件都會遇到尋道時間。

+0

謝謝!這正是我想要做的。你有這樣的一些提示嗎?我們可以忽略目錄,只考慮兩個文件a和b的情況。我將首先將a和b文件映射到連續內存。然後將整個緩衝區複製到目標。但在這種情況下,我只會在目的地得到一個大文件。我不知道如何以較低的成本將一個大文件重建爲兩個文件。你有一些提示嗎?我想我們可以重置文件的起始偏移量,但不知道如何去做。謝謝, – 2010-04-05 18:21:24

+0

如果你不需要保存關於這些文件的元數據,比如姓名和日期,只需在內容之前寫下每個文件的長度。如果您確實需要保留元數據,請使用標準存檔格式,如tar或zip,而不進行壓縮。 正好有兩個文件,你可以寫出第二個文件開始位置的偏移量。 – drawnonward 2010-04-06 11:28:16

0

由於某些原因,cpio通常比tar更受歡迎。

例如,您可以將cpio傳輸到遠程運行cpio的ssh會話。

+0

你的意思是s/svn/ssh /?總之,焦油也可以做到這一點。 – ephemient 2010-04-05 14:24:08

+0

當然是。 SSH。 – 2010-04-05 17:50:08