2017-04-21 2 views
0

Kontext: Ich lese eine Excel-Datei in einem bestimmten Format mit Apache POI-Bibliothek. Jede Datei hat nur ein Blatt und eine bestimmte Vorlage. Ich kann das Blatt lesen, einige Änderungen an den Werten vornehmen, sie als POJO speichern und dann mithilfe einer JAXB-Implementierung in XML umwandeln.Java - POI - Leistung

Problem: Ich lese nur ein paar Excel-Dateien (sagen 100) für jetzt, aber ich wollte meine Anwendung so gestalten, dass es skalierbar ist genug, um rund 1000 bis 10000 Dateien zu lesen. Können Sie eine gute Architektur für das gleiche vorschlagen. Sollte ich Multithreading (etwa einen Threadpool mit 10 Threads) verwenden, um 10 Blätter gleichzeitig zu lesen, oder wäre das ein schlechter Entwurf, wenn man bedenkt, dass jedes Blatt getrennte Daten hat, die nicht mit einem anderen Blatt verknüpft sind.

Hinweis: Ich kann die Code-Snippets nicht teilen, da dies proprietärer Code ist, obwohl wir annehmen können, dass jedes Blatt 50 Zeilen und jede Zeile 6 bis 10 Spalten mit reinen Textdaten hat die Zellen. Da die Datei klein ist, lade ich die gesamte Datei in den Speicher und bearbeite sie dann. Außerdem verwende ich Apache Poi-Code, um durch die Reihen und Spalten zu iterieren (Probe unten).

P.S. Dies ist meine erste Frage zu SO, also zögern Sie nicht, Änderungen/Verbesserungen in meiner Frage vorzuschlagen.

Danke und Grüße, Sid

+1

Nun müssten wir wissen, wie genau Sie die Daten lesen. Sie könnten den Code ändern, um zu simulieren, wie Sie die Daten lesen (sollte kein Problem mit dem proprietären Ding sein) – XtremeBaumer

+0

Da sie nicht miteinander verknüpft sind, ist es sehr gut für die parallele Verarbeitung geeignet. –

+0

@XtremeBaumer Habe ein Snippet hinzugefügt. Bitte sehen Sie, ob es hilft. – phoenixSid

Antwort

0

Wenn Sie möchten, könnten viele Dinge parallel verarbeiten wollen in POI SAX ändern Parsen, erhöhten wir die Leistung um Größenordnungen, das zu tun (Wir hatten ziemlich große Dateien beginne mit).

Sie sagen, dass Sie Dateien in den Speicher laden, um die Leistung zu verbessern, sollten Sie auch SSDs anstelle von HDDs verwenden, wenn es viel I/O ist. (Wenn Sie nicht alles in RAM passen)

Auch die Thread-Pool-Größe sollte dies in Erwägung ziehen: Number of processor core vs the size of a thread pool.

Sie in Erwägung ziehen könnte es eine Pipeline-Ansatz machen (je nachdem, wie Sie Code strukturiert ist), so dass Sie so etwas wie:

excelFiles.parallelStream().map(read).map(mainpulate).map(store).map(convert) 

Wenn Sie Filter dort irgendwo drücken oder wenn leer etwas zurückgibt, kann man reduzieren die Last leichter in der faulen Annäherung.

Nur ein paar Ideen, YMMV.

+0

Danke für Ihre Ideen! Ich suche jedoch eine Softwarearchitektur wie in Klassendiagrammen, die in seinem Szenario gut wäre. Jaxb macht es auch viel einfacher als manuell alles über sax zu analysieren. – phoenixSid