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 das Swapping (Auslagerungsmechanismus).
Sobald der eingestellte Prozentsatz des maximal zugewiesenen Speichers ausgenutzt ist, 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? Der Punkt, der uns an dieser Stelle interessiert ist der folgende. Werden alle Daten nur in ein einziges Datenblatt eingelesen, 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 Bordmitteln lässt sich das ganz gut verarbeiten. Das wichtigste ist, wir haben nun viele Datenblätter und damit kein Speicherproblem mehr.