| 

.NET C# Java Javascript Exception

2
Hallo,

ich muss eine ziemlich große Textdatei verarbeiten, die - zumindest meines Wissens nach - nicht in einen String eingelesen werden kann. Andernfalls hätte ich diese gern in einen Strin geladen und dann über RegEx zerlegt. Zeilenweise einlesen ist auch irgendwie blöd - jeweils einen RegEx über mehrere Zeilen einzulesen und dann weiter zu zerlegen wäre, cool - geht aber meines Wissen nach nicht?!

Nebenbei bemerkt besteht die Datei jeweils aus einer Zeile mit Metainformationen und dann einem beliebig langem HTML-Dokument - das Ganze dann. immer und immer wieder - also, nur falls sich darüber ein ganz neuer Denkansatz ergibt.

Gruß

Lars
News:
27.07.2015
Lars 251 1 5
Kannst du mal nen Dummy von Meta-Info-Zeile und HTML zeigen, damit man sich das genauer vorstellen kann. Was genau willst du mit dem RegEx erreichen? Einfach die Meta-Daten und HTML getrennt verarbeiten oder suchst du etwas bestimmtes in den Daten? (Ggf. wäre ein SAX-Parser besser geeignet)
Was passiert mit den ausgelesenen Daten? Werden die nur irgendwo anders hingeschrieben (DB, Files) oder müssen die anderweitig Weiterverarbeitet werden?
phg 27.07.2015
du hast leider nicht angegeben, welche Technologie (Java, .NET) du verwendest. In .NET kann ein String bis zu 2.147.483.647 Zeichen enthalten. Das sollte für größere Textdateien reichen.
luedi 28.07.2015
VB.NET - und ich habe eigentlich "nur" 1.238.140.273 Zeichen, bekommen in einer x64 Kosolenanwendung aber eine OutOfMemoryException. Die Anwendung ist eigentlich so konfiguriert, dass sie damit um gehen können sollte:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
</configuration>
Lars 28.07.2015
Zum Zeitpunkt der Fehlermeldung sind nebenbei bemerkt noch über 2GB RAM frei.
Lars 28.07.2015
Das liegt wahrscheinlich daran, dass kein größerer durchgägngiger freier Block verfügbar war. Außerdem werden im Daetnetyp String Unicode-Zeichen gespeichert, d.h. 2Bytes pro Zeichen. Wie groß sind deine Quelldateien eigentlich im Schnitt?
luedi 29.07.2015
2 Antworten
0
Die Metainformationen sehen sehen so aus:

123451234T12345T"TTT"+"TTT"+"TTT"+31122014000000311220140000003112201400000031122014000000"TTT"++1234567890,

<div>
...
</div>

123451234T12345T"TTT"+"TTT"+"TTT"+31122014000000311220140000003112201400000031122014000000"TTT"++1234567890,

<div>
...
</div>
...


In den Metainformationen sind entweder Felder fester Länge oder variabler Länge mit Trennzeichen, welche zerlegt werden und dann als Detailinformationen des HTML-Dokuments dienen. Das ganze soll anschließend ein eine Datenbank geladen werden, allerdings kriege ich aufgrund der Struktur z. B. kein Bulk Insert hin. Daher suche ich alternative Ansätze.
27.07.2015
Lars 251 1 5
0
Ich skizziere mal nen allgemeinen Ansatz, so wie ich deine Anforderung verstehe.

String meta = null
String zeile = null
String html = ""

while zeile = file.getLine()
if zeile.match("/^(\d+|\"|T|+)+,$/") // regex-prüfung, ist optimierungsfähig
if meta != null && html != null
verarbeite(meta, html)
end

meta = parseMeta(zeile)
hmlt = ""
else
html += zeile
end


In der Methode verarbeite füllst du dann die Meta-Daten in das HTML. Am wenigsten Arbeitsspeicher würde dafür ein SAX-Parser brauchen mit dem ein neues HTML-Dokument erzeugt wird und die Meta-Daten eingefügt werden. Es gibt aber auch andere Möglichkeiten, eventuell auch XSL. Mit RegEx auf das HTML würde ich nicht losgehen, das halte ich für zu teuer (CPU,RAM).

Das erzeugte HTML wird dann in der Datenbank gespeichert und weiter gehts bis EOF.

Eventuell lassen sich die Meta-Daten mit den Fest-Variablen-Längen-Feldern auch besser mit etwas anderem verarbeiten als mit RegEx, aber das würde ich als letzten Optimierungs-Schritt ansehen, sofern der RegEx nicht jetzt schon große Probleme macht.

Optimierungsmöglichkeiten:
1. Immer n Zeilen lesen und dann erst parsen und verarbeiten
2. Immer m HTML-Dokumente erzeugen und dann via Bulk-Insert in der DB speichern
3. ...

Optimieren würde ich aber erst wenn der Code an sich läuft und dann mal messen an welcher stelle es überhaupt Sinn macht zu optimieren.
29.07.2015
phg 1,6k 3

Stelle deine --Frage jetzt!