verarbeite ich eine riesige CSV (1 GB) mit Java-Code.java.lang.OutOfMemoryError Während der Verarbeitung einer großen CSV-Datei
Meine Anwendung läuft auf 2-Core-Maschine mit 8 GB Speicher.
Ich benutze unten Befehl, um meine Anwendung zu starten.
Applcation startet einen Thread, um CSV von S3 zu laden und zu verarbeiten. Anwendung funktioniert für einige Zeit, aber OutOfMemoryError zur Hälfte Verarbeitung der Datei.
Ich bin auf der Suche nach einer Möglichkeit, die CSV-Datei weiter zu verarbeiten und gleichzeitig die Speicherauslastung gering zu halten.
im CSV-Prozess Ich bin der Durchführung folgender Schritte:
//Step 1: Download FROM S3
String bucketName = env.getProperty(AWS_S3_BUCKET_NAME);
AmazonS3 s3Client = new AmazonS3Client(credentialsProvider);
S3Object s3object = s3Client.getObject(new GetObjectRequest(bucketName, key));
InputStream inputSteam = s3object.getObjectContent(); //This Stream contains about 1GB of data
//Step 2: Parse CSV to Java
ObjectReader oReader = CSV_MAPPER.readerFor(InboundProcessing.class).with(CSV_SCHEMA);
try (FileOutputStream fos = new FileOutputStream(outputCSV, Boolean.FALSE)) {
SequenceWriter sequenceWriter = CsvUtils.getCsvObjectWriter(InboundProcessingDto.class).writeValues(fos);
MappingIterator<T> mi = oReader.readValues(inputStream)
while (mi.hasNextValue()) {
InboundProcessing inboundProcessing = mi.nextValue();
inboundProcessingRepository.save(inboundProcessing); // this is Spring JPA Entity Save operation. (Almost 3M records so 3M calls)
sequenceWriter.write(inboundProcessingDto); // this is writing to a CSV file on local file system which is uploaded to S3 in next Step
}
} catch (Exception e) {
throw new FBMException(e);
}
Es sieht so aus, als ob Sie das ganze Ding sofort in den Speicher einlesen. Ist das notwendig? – pvg
Wenn Ihr Startbefehl wirklich 'java -Xms4g -Xms6g ...' enthält, sollten Sie ihn in 'java -Xms4g -Xmx6g ...' korrigieren. – blafasel
Danke. Es war ein Tippfehler. – Pramod