Лучшая стратегия для обработки больших файлов CSV в Apache Camel - PullRequest
14 голосов
/ 14 ноября 2011

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

Проблема в том, что файлы могут быть довольно большими (миллион строк), поэтому я бы предпочел ставить в очередь по одной строке за раз, но я получаю все строки в java.util.ArrayList вконец Bindy, который вызывает проблемы с памятью.

Пока у меня есть небольшой тест, и unmarshaling работает, поэтому конфигурация Bindy с использованием аннотаций в порядке.

Вот маршрут:

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000")
  .unmarshal()
  .bindy(BindyType.Csv, "com.ess.myapp.core")           
  .to("jms:rawTraffic");

Среда: Eclipse Indigo, Maven 3.0.3, Camel 2.8.0

Спасибо

Ответы [ 3 ]

29 голосов
/ 14 ноября 2011

Если вы используете Splitter EIP, вы можете использовать потоковый режим, который означает, что Camel будет обрабатывать файл построчно.

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000")
  .split(body().tokenize("\n")).streaming()
    .unmarshal().bindy(BindyType.Csv, "com.ess.myapp.core")           
    .to("jms:rawTraffic");
2 голосов
/ 01 июня 2017

Для записи и для других пользователей, которые, возможно, искали это столько же, сколько и я, тем не менее существует более простой метод, который также хорошо работает с useMaps :

CsvDataFormat csv = new CsvDataFormat()
    .setLazyLoad(true)
    .setUseMaps(true);

from("file://data/inbox?noop=true&maxMessagesPerPoll=1&delay=5000")
    .unmarshal(csv)
    .split(body()).streaming()
    .to("log:mappedRow?multiline=true");
0 голосов
/ 27 марта 2018

Использование EIP Splitter и Aggregator было бы лучшей стратегией для обработки больших файлов CSV в Apache Camel.Подробнее об этом читайте в форме Обработчик составленных сообщений

Вот пример использования Java DSL:

package com.camel;

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.dataformat.csv.CsvDataFormat;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.QuoteMode;

public class FileSplitter {

    public static void main(String args[]) throws Exception {
        CamelContext context = new DefaultCamelContext();
        CsvDataFormat csvParser = new CsvDataFormat(CSVFormat.DEFAULT);
        csvParser.setSkipHeaderRecord(true);
        csvParser.setQuoteMode(QuoteMode.ALL);
        context.addRoutes(new RouteBuilder() {
            public void configure() {
                String fileName = "Hello.csv";
                int lineCount = 20;
                System.out.println("fileName = " + fileName);
                System.out.println("lineCount = " + lineCount);
                from("file:data/inbox?noop=true&fileName=" + fileName).unmarshal(csvParser).split(body()).streaming()
                        .aggregate(constant(true), new ArrayListAggregationStrategy()).completionSize(lineCount)
                        .completionTimeout(1500).marshal(csvParser)
                        .to("file:data/outbox?fileName=${file:name.noext}_${header.CamelSplitIndex}.csv");
            }
        });
        context.start();
        Thread.sleep(10000);
        context.stop();
        System.out.println("End");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...