Question

Bonjour, Je reçois très grand nombre d'enregistrements de base de données et d'écrire dans un file.I se demandait quelle est la meilleure façon d'écrire des fichiers énormes. (1Go - 10Gb).

Actuellement, je suis en utilisant BufferedWriter

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
 //do writings
}
mbrWriter.close();
Était-ce utile?

La solution

Si vous insistez vraiment utiliser Java pour cela, alors la meilleure façon serait d'écrire immédiatement dès que les données proviennent et donc de ne pas recueillir tous les données de ResultSet dans la mémoire de Java en premier. Vous auriez besoin d'au moins autant de mémoire libre en Java autrement.

Ainsi, faire par exemple.

while (resultSet.next()) {
    writer.write(resultSet.getString("columnname"));
    // ...
}

Cela dit, les navires de DB plus décents avec des capacités d'exportation BUILTIN-to-CSV qui sont indubitablement de manière plus efficace que vous pourriez jamais faire en Java. Vous ne l'avez pas mentionné celui que vous utilisez, mais si elle était par exemple MySQL, vous auriez pu utiliser le LOAD DATA INFILE pour cela. Il suffit de consulter la documentation spécifique DB. Espérons que cela donne de nouvelles perspectives.

Autres conseils

La taille de la mémoire tampon par défaut pour un BufferedWriter est 8192. Si vous allez écrire des fichiers squigabyte, vous pouvez augmenter cette aide du constructeur argument 2; par exemple.

int buffSize = ... // 1 megabyte or so
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize);

Cela devrait réduire le nombre de syscalls nécessaires pour écrire le fichier.

Mais je doute que cela ferait plus d'un couple de différence pour cent. Tirer les lignes de la resultset sera probablement le principal goulot d'étranglement. Pour des améliorations significatives des performances que vous auriez besoin d'utiliser en vrac des installations d'exportation d'origine de la base de données.

Je ne suis pas sûr à 100%, mais il semble tha BufferedReader charge les données dans une mémoire tampon dans la RAM. Java peut utiliser 128 Mo de RAM (sauf indication contraire), de sorte que le BufferedReader sera probablement la mémoire java débordement provoquant une erreur. Essayez d'utiliser InputStreamReader et FileInputStream à lire et stocker les données dans un char, alors il suffit d'écrire que l'omble en utilisant un FileOutputStream.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top