Je travaille sur l'application qui lit de grandes quantités de données à partir d'un fichier. Fondamentalement, j'ai un énorme fichier (environ 1,5 - 2 concerts) contenant des objets différents (~ 5 à 10 millions d'entre eux par fichier). Je dois tous les lire et les mettre à différentes cartes dans l'application. Le problème est que l'application manque de mémoire lors de la lecture des objets à un moment donné. Ce n'est que lorsque je le mets à utiliser -Xmx4096m - qu'il peut gérer le fichier. Mais si le fichier est plus grand, il ne pourra plus le faire.Comment éviter l'exception OutOfMemory lors de la lecture de fichiers volumineux en Java
est ici l'extrait de code:
String sampleFileName = "sample.file";
FileInputStream fileInputStream = null;
ObjectInputStream objectInputStream = null;
try{
fileInputStream = new FileInputStream(new File(sampleFileName));
int bufferSize = 16 * 1024;
objectInputStream = new ObjectInputStream(new BufferedInputStream(fileInputStream, bufferSize));
while (true){
try{
Object objectToRead = objectInputStream.readUnshared();
if (objectToRead == null){
break;
}
// doing something with the object
}catch (EOFException eofe){
eofe.printStackTrace();
break;
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
} catch (Exception e){
e.printStackTrace();
}finally{
if (objectInputStream != null){
try{
objectInputStream.close();
}catch (Exception e2){
e2.printStackTrace();
}
}
if (fileInputStream != null){
try{
fileInputStream.close();
}catch (Exception e2){
e2.printStackTrace();
}
}
}
Tout d'abord, j'utilisais ObjectInputStream.readObject() au lieu de objectInputStream.readUnshared(), il a résolu le problème en partie. Lorsque j'ai augmenté la mémoire de 2048 à 4096, il a commencé à analyser le fichier. BufferedInputStream est déjà utilisé. Du web j'ai trouvé seulement des exemples comment lire des lignes ou des octets, mais rien concernant des objets, performance sage.
Comment puis-je lire le fichier sans augmenter la mémoire de la machine virtuelle Java et éviter l'exception OutOfMemory? Est-il possible de lire des objets à partir du fichier, ne gardant rien d'autre dans la mémoire?
La physique est simple: les fichiers volumineux nécessitent plus de mémoire. Il n'y a pas de magie là-bas. Vos fichiers ne contiennent pas d'objets - ils contiennent des octets qui sont mappés à des chaînes mappées à des objets. – duffymo
Si vous pouvez trier des données dans des cartes pendant que vous lisez le fichier principal, vous pouvez utiliser BufferReader pour lire fichier par ligne, puis utiliser PrintWriter pour ajouter des données au fichier existant ou en créer un nouveau. – Jure
Si les fichiers sont trop gros, vous n'avez pas le choix, mais stockez-les sur le F.S. Lisez ceci: https://commons.apache.org/proper/commons-jcs/ –