2010-02-19 58 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