Phase 2: Daten parsen (OutOfMemoryError)

Auslagerungsmechanismus


Was hat das Parsen von Daten mit dem Speicherverbrauch zu tun? An sich sind es doch immer dieselben Daten. Das ist zwar richtig, allerdings kann die logische Aufteilung der Daten großen Einfluss auf den Speicherverbrauch haben. Der Grund hierfür ist der Auslagerungsmechanismus von Lobster_data.

Sobald Lobster_data den eingestellten Prozentsatz des maximal zugewiesenen Speichers ausgenutzt hat, würde ein Profil mit obiger Einstellung Daten auf die Platte auslagern. Das geschieht jedoch nur in ganzen Datenblättern. Wie so ein Datenblatt (je nach Dokumentenart) entsteht, finden Sie beschrieben im Abschnitt Wann beginnt der Parser ein neues Datenblatt (Record)? Der Punkt, der uns an dieser Stelle interessiert ist der folgende. Liest Lobster_data alle Daten nur in ein einziges Datenblatt ein, ist der Auslagerungsmechanismus ausgehebelt. Denn das Datenblatt, an dem er gerade arbeitet, muss er nun mal im Speicher haben. Gelingt es Ihnen dagegen die Daten in mehreren Datenblättern unterzubringen, kann er alle, die er gerade nicht bearbeitet, auslagern und somit eine Menge Speicher sparen.

Daten splitten


Manchmal reicht aber selbst das noch nicht. Dann hilft nur noch eines: Man teilt die Daten künstlich auf mehrere Datenblätter auf. Diese Arbeit übernimmt - ähnlich dem TokenStreamSplitter für die Dokumentenarten CSV oder Feste Länge der Preparser EdifactSegmentSplitter. Man gibt ihm ein Segment an, das die Segmentgruppe einleitet, die sich eine bestimmte Anzahl oft wiederholt. Bei einem INVRPT ist das LIN-Segment aus der SG9 (Version D12A). Außerdem sagt man ihm, wie viele davon in einem Datenblatt (maximal) auftauchen dürfen. Nun fasst der Preparser immer die angegebene Zahl an LIN-Segmenten (mit ihren PIA, IMD, usw.) zusammen und setzt alles, was davor kam (UNB bis SG8), jedes Mal als Kopie drüber sowie ein UNT drunter. Das ergibt nicht unbedingt ganz saubere "Zwischendaten", aber mit den Mitteln des Lobster_data lässt sich das ganz gut verarbeiten. Das wichtigste ist, wir haben nun viele Datenblätter und damit kein Speicherproblem mehr.