2010-02-19 84 views
0

我正在編寫一個實用程序,它將使用LZMA sdk壓縮一個文件(或一組文件),然後將該文件發送到一個ftp服務器。通常壓縮的速度比ftp連接的速度快。我想要做的是不是壓縮文件,等待它完成,然後開始上傳我想壓縮到臨時文件或流,然後當它被壓縮時上傳完成的部分。Pipeling壓縮和ftp傳輸

現在的問題是如何?

我擔心的一個問題是,我將要處理的文件在壓縮時可能會超過1GB,而我將運行該系統的系統將擁有512MB和2GB的RAM,因此我不想讓壓縮端運行瘋狂進入內存並鎖定系統。我一直在考慮的方法是在一個線程中運行壓縮,在內存流中排隊5-10Mb,然後將信息發送到另一個線程中的ftp。這是一個好方法還是有更好的方法來做到這一點?是否有任何需要在文件開始時重寫文件頭的問題?

我打算在c#中編寫此代碼,但c,C++或java中的代碼示例也很好。

謝謝你的幫助。

回答

1

我不熟悉LZMA SDK,但在C#中使用SharpZipLib庫可以很容易地流出zip文件。您不必擔心內存,任何時候只有被壓縮/流式傳輸的塊纔會在內存中。我們使用它來通過HTTP壓縮和流式傳輸文件,但FTP的概念是相同的。

基本上你會創建一個ZipOutputStream,將數據傳遞給FTP流。在每個文件的開頭調用PutNextEntry,然後傳輸文件內容。沒有比這更多的了。

http://www.icsharpcode.net/OpenSource/SharpZipLib/

+0

當你說該文件的內容是您使用StreamUtils.Copy或者你有個人寫(緩衝區,偏移,長度)的調用分塊出來流? – 2010-02-19 20:05:55

+0

@Scott Chamberlain,無論哪種方式工作。所有'StreamUtils.Copy'都會在'source.Read()'和'destination.Write()'上運行一個循環。 – 2010-02-19 20:28:24