Трубопроводное сжатие и передача ftp - PullRequest
0 голосов
/ 19 февраля 2010

Я пишу утилиту, которая будет архивировать файл (или набор файлов) с помощью LZMA SDK, а затем отправлять файл на FTP-сервер. Обычно скорость сжатия выше, чем скорость соединения ftp. Я хотел бы вместо сжатия файла дождаться его завершения, затем начать загрузку, которую я хотел бы сжать во временный файл или поток, а затем во время сжатия загрузить готовые части.

Вопрос теперь в том, как?

Одна проблема, с которой я сталкиваюсь, - файлы, с которыми я буду работать, могут быть больше 1 ГБ при сжатии, и системы, на которых я буду работать, будут иметь от 512 МБ до 2 ГБ оперативной памяти, поэтому я не хочу, чтобы сторона сжатия работала с дикими проблемами в память и заблокировать систему. Метод, о котором я думал, - это запустить сжатие в потоке, поставить в очередь 5-10 Мбайт в потоке памяти, а затем отправить информацию на ftp в другом потоке. Это хороший подход или есть лучший способ сделать это? Есть ли какие-то ошибки, такие как необходимость переписывать заголовок файла в начале файла, когда это будет сделано, или что-то еще?

Я планирую написать это на c #, но примеры кода на c, c ++ или java тоже подойдут.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 19 февраля 2010

Я не знаком с LZMA SDK, но в C # с библиотекой SharpZipLib легко выгружать zip-файлы.Вам не нужно беспокоиться о памяти, только блоки, сжимаемые / передаваемые в поток, будут в памяти одновременно.Мы используем это для сжатия и потоковой передачи файлов через HTTP, но концепция FTP та же.

По сути, вы создаете ZipOutputStream, который передает данные в поток FTP.Вызовите PutNextEntry в начале каждого файла и затем передайте содержимое файла.Не намного больше, чем это.

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

...