Какой самый быстрый дизайн для загрузки и преобразования большого двоичного файла? - PullRequest
3 голосов
/ 18 июня 2010

У меня есть бинарный файл 1 ГБ в другой системе.

Требование: ftp / загрузить и преобразовать двоичный файл в CSV в основной системе.

Преобразованный файл будет на несколько больше больше ~ 8 ГБ

Каков наиболее распространенный способ сделать что-то похожее на это?
Если это двухэтапный независимый процесс, загрузите - затем конвертируйте?
Должен ли я загружать небольшие куски за раз и конвертировать во время загрузки?

Я не знаю наиболее эффективный способ сделать это ... и что я должен быть осторожен с файлами такого размера?

Любой совет приветствуется.

Спасибо.

(Visual Studio C ++)

Ответы [ 6 ]

5 голосов
/ 18 июня 2010

Я бы написал программу, которая конвертирует двоичный формат и выводит его в формат CSV.Эта программа будет читать из стандартного ввода и писать в стандартный вывод.

Тогда я бы назвал

wget URL_of_remote_binary_file --output-document=- | my_converter_program > output_file.csv

Таким образом, вы можете начать конвертацию немедленно (без загрузки всех файлов), и ваша программа неиметь дело с сетью.Вы также можете запустить программу на удаленной стороне, если она достаточно портативна.

4 голосов
/ 18 июня 2010

Не зная никакой специфики, я бы пошел с двоичной загрузкой ftp, а затем постобработал с отдельной программой преобразования. Это разбило бы процесс на две отдельные и не связанные части, которые помогли бы в построении и отладке всей системы. Не нужно заново изобретать систему FTP и много возможностей для оптимизации постобработки.

3 голосов
/ 18 июня 2010

Чтобы избежать слишком большого трафика, я бы на первом этапе сжал и передал файл.Процесс преобразования, если что-то идет не так или требуется другой вывод, может быть переделан локально без повторной загрузки данных.

Единственная мера предосторожности - не загружать весь материал в память, а затем преобразовывать, а делать это по частям, как высказал.Вы можете предотвратить некоторые неприятные эффекты для пользователей вашей программы, создав / предварительно выделив огромный файл максимально ожидаемого размера.Это позволяет избежать нехватки дискового пространства на этапе преобразования.Кроме того, некоторым файловым системам не нравятся файлы размером более 2 ГБ или 4 ГБ, что также может быть использовано при предварительном размещении.

2 голосов
/ 18 июня 2010

Это зависит от ваших данных и ваших требований.Какие требования к производительности у вас есть?Вам нужно закончить, например, задание за X раз (где скорость критична), или это то, что будет выполняться периодически (в этом случае скорость не важна)?

Тем не менее, выбезусловно, получит более чистую реализацию, если разделить работу на две задачи - загрузчик и конвертер.Таким образом, каждый компонент может быть простым и просто сосредоточиться на поставленной задаче.При прочих равных условиях я рекомендую этот подход.

В противном случае, если вы попытаетесь одновременно загрузить / конвертировать, вы можете попасть в ситуации, когда ваш загрузчик имеет готовые данные, но конвертеру требуется больше данных, прежде чем он сможет продолжить,Опять же, нет никаких причин, по которым ваш код не может справиться с этим, но это усложнит реализацию и усложнит отладку / тестирование / проверку.

1 голос
/ 18 июня 2010

Вот еще больше предположений о ваших требованиях и возможных решениях:

  • Заинтересованы в целостности файла?Реализуйте что-то, что включает проверки целостности, такие как порядковые номера, поля размера и контрольные суммы / хэши, и достаточно семантики транзакций, чтобы система знала, была ли передача завершена или нет.ссылки, а может быть прерваны?Реализуйте протокол, позволяющий возобновить передачу после прерывания.
  • Повторяются ли загрузки, при этом большая часть данных остается неизменной?Реализуйте что-то поддающееся постепенному обновлению, чтобы вы загружали только различия.
1 голос
/ 18 июня 2010

Обычно лучше делать это как отдельные процессы без взаимозависимости.Если в будущем ваши требования изменятся, вы можете повторно использовать их или использовать для других проектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...