Clojure / Java: самый эффективный метод минимизации потребления полосы пропускания при выполнении сложных операций на потоке данных Amazon S3

StackOverflow https://stackoverflow.com/questions/3580152

Вопрос

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

Мне нужно сделать две вещи с этим объектом:

  1. Передайте его в Supercsv CSV Reader
  2. Получить сырьевые линии и сохранить их в (Clojure) ленивой последовательности

В настоящее время мне необходимо использовать два разных буфереза: один в качестве аргумента для класса читателя CSV SuperCSV и один для инициализации ленивой последовательности необработанных линий. Я эффективно загружаю объект S3 дважды, что дорого ($) и медленно.

Один из моих коллег указал, что что-то аналогичное команду Unix «Tee», это то, что я ищу. Буферреджер, который может каким-то образом быть «разбитым», загрузить кусок данных, и пройти копию как на ленивую последовательность, так и функциональность читателя CSV будет полезна.

Я также в настоящее время расследую, можно ли обернуть ленивую последовательность в буферреджере и пройти это в супер CSV. У меня были некоторые проблемы с пространством кучи Java при прохождении очень больших ленивых последовательностей нескольким потребителям, поэтому я вроде беспокоюсь о использовании этого решения.

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

Окончательное решение, и тот, который я бы рассмотрел только в том случае, если ничего не работает, реализует мой собственный читатель CSV, который возвращает оба PARSED CSV, так и исходную ненудимую строку. Если вы использовали очень солидный читатель CSV, который может вернуть как java hash parsed data cv и исходной непарной строки, пожалуйста, дайте мне знать!

Спасибо!

Это было полезно?

Решение 2

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

Другие советы

Я был бы склонен пойти с созданием SEQ строк из сети, а затем передать это, чтобы во многих процессах нужно работать над этим SEQ; Стойкие структуры данных остыть таким образом. В случае необходимости превратить SEQ струн в читателю, что вы можете отдать в API SuperCSV, это кажется:

(Импорт «java.io Reader StringReader]) (Defn Concat-Reader» возвращает читатель, который читает из последовательности строк. «[Строки] (пусть [SRS (Atom (MAP # (StringReader.%) строки))] (Прокси [Reader] [] (READ ([] (пусть [C (.read (first @srs))] (если (и (нег? C) (SWAP! SRS Далее)) (.ead this) c)) ) ([CBUF] (.ed Этот CBUF 0 (счетчик CBUF))) ([CBUF вне Лен] (пусть [актуально (.read (first @srs) cbuf выкл.) (если (и (нег? Swap! SRS Далее)) (.ead этот CBUF Off Off Len) Актуально)))) (Закрыть []))))

Например

user => (def r (concat-reader ["foo" "Bar"])) # 'User / r user => (def cbuf (char-array 2)) #' user / cbuf user => (.read r CBUF) 2 пользователя => (SEQ CBUF) ( f  o) user => (char (.read r))  o user => (char (.read r))  b
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top