Hallo,
ik heb een XML bestand van een kleine 100MB. Vanuit de nodes moeten er een aantal objecten aangemaakt worden die een relatie hebben met elkaar, indien zij genest zijn (parent-child relatie). Vervolgens wordt de informatie uit de nodes in een database opgeslagen...
Ik parse het XML bestand via de standaard SAX parser van de JDK 1.5.0_4, event-based dus (ik zou ook geen andere mogelijkheid weten, een [J]DOM implementatie neemt veel te veel geheugen in beslag).
De database wordt aangeroepen op basis van 1 centrale connection die beschikbaar is (anders moet je iedere keer weer reconnecten, veel te veel overhead). De save() actie van het object heeft tenminste twee queries tot gevolg (checken op aanwezigheid, indien niet aanwezig toevoegen, indien wel aanwezig, id opzoeken). De ResultSets die gebruikt worden, worden ook direct weer afgesloten. SQLExceptions en dergelijke worden direct naar de console weggeschreven.
Het probleem steekt nu echter in het volgende: het document levert meer dan 100.000 instanties van een bepaald object op. Hierdoor knalt het geheugengebruik door het plafond. Als ik de -Xmx512M parameter meegeef aan het commando java dan houdt het programma na een bepaalde tijd op met functioneren (er wordt niets meer weggeschreven naar de database), maar er volgt geen exception, het programma blijft dus wel draaien. Het maakt niet uit of ik dit programma uitvoer onder Windows XP PRO SP 2 of Linux (zelfde versie van de JDK). Als ik minder dan bijvoorbeeld -Xmx256M gebruik, stopt het programma met de uitvoer middels een OutOfMemoryException (heap size).
Het lijkt mij voor zich spreken dat het programma dus gewoon van begin tot eind het bestand door moet lopen en al dan niet de informatie moet toevoegen aan de database, zonder dat het zomaar stopt in de uitvoering, of dat het Exceptions oplevert die te maken hebben met geheugengebruik.
Ik heb geprobeerd het geheugengebruik terug te dringen:
ik heb een XML bestand van een kleine 100MB. Vanuit de nodes moeten er een aantal objecten aangemaakt worden die een relatie hebben met elkaar, indien zij genest zijn (parent-child relatie). Vervolgens wordt de informatie uit de nodes in een database opgeslagen...
Ik parse het XML bestand via de standaard SAX parser van de JDK 1.5.0_4, event-based dus (ik zou ook geen andere mogelijkheid weten, een [J]DOM implementatie neemt veel te veel geheugen in beslag).
De database wordt aangeroepen op basis van 1 centrale connection die beschikbaar is (anders moet je iedere keer weer reconnecten, veel te veel overhead). De save() actie van het object heeft tenminste twee queries tot gevolg (checken op aanwezigheid, indien niet aanwezig toevoegen, indien wel aanwezig, id opzoeken). De ResultSets die gebruikt worden, worden ook direct weer afgesloten. SQLExceptions en dergelijke worden direct naar de console weggeschreven.
Het probleem steekt nu echter in het volgende: het document levert meer dan 100.000 instanties van een bepaald object op. Hierdoor knalt het geheugengebruik door het plafond. Als ik de -Xmx512M parameter meegeef aan het commando java dan houdt het programma na een bepaalde tijd op met functioneren (er wordt niets meer weggeschreven naar de database), maar er volgt geen exception, het programma blijft dus wel draaien. Het maakt niet uit of ik dit programma uitvoer onder Windows XP PRO SP 2 of Linux (zelfde versie van de JDK). Als ik minder dan bijvoorbeeld -Xmx256M gebruik, stopt het programma met de uitvoer middels een OutOfMemoryException (heap size).
Het lijkt mij voor zich spreken dat het programma dus gewoon van begin tot eind het bestand door moet lopen en al dan niet de informatie moet toevoegen aan de database, zonder dat het zomaar stopt in de uitvoering, of dat het Exceptions oplevert die te maken hebben met geheugengebruik.
Ik heb geprobeerd het geheugengebruik terug te dringen:
- een instantie van het object aan te maken en vervolgens te recyclen (je reset alle waarden van de instantie en kent de variabelen overnieuw toe)
- de instantie = null op te geven en vervolgens een nieuwe instantie aan te maken
- expliciet op gezette tijden System.gc() uit te voeren tijdens het programma (je hint dan dat de garbage collector aan de slag moet gaan om de troep op te ruimen).
- alle mogelijke combinaties van de bovenstaande drie opties