Ho letto il file e creato un oggetto da esso e archiviato nel database postgresql. Il mio file ha 100.000 documenti che ho letto da un file, li ho divisi e infine li ho archiviati nel database. Non riesco a creare List<>
e memorizzare tutti i documenti in List<>
perché la mia RAM è piccola. Il mio codice per leggere e scrivere nel database sono i seguenti. Ma My JVM Heap si riempie e non può continuare a memorizzare più documenti. Come leggere file e archiviarli nel database in modo efficiente.Come inserire i dati il più velocemente possibile con Hibernate
public void readFile() {
StringBuilder wholeDocument = new StringBuilder();
try {
bufferedReader = new BufferedReader(new FileReader(files));
String line;
int count = 0;
while ((line = bufferedReader.readLine()) != null) {
if (line.contains("<page>")) {
wholeDocument.append(line);
while ((line = bufferedReader.readLine()) != null) {
wholeDocument = wholeDocument.append("\n" + line);
if (line.contains("</page>")) {
System.out.println(count++);
addBodyToDatabase(wholeDocument.toString());
wholeDocument.setLength(0);
break;
}
}
}
}
wikiParser.commit();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void addBodyToDatabase(String wholeContent) {
Page page = new Page(new Timestamp(System.currentTimeMillis()),
wholeContent);
database.addPageToDatabase(page);
}
public static int counter = 1;
public void addPageToDatabase(Page page) {
session.save(page);
if (counter % 3000 == 0) {
commit();
}
counter++;
}
Forse avete bisogno di aggiungere 'StringBuilder wholeDocument = new StringBuilder();' da qualche parte dentro i loop –
tra l'altro, StringBuilder sono mutabili, non c'è bisogno di fare questo 'wholeDocument = wholeDocument.append (" \ n "+ line);', usa semplicemente 'wholeDocument.append (" \ n "+ line);' –
Cosa fa 'commit()'? –