Je traite un certain nombre de fichiers texte ligne par ligne en utilisant BufferReader.readlLine()
.
Deux fichiers ayant la même taille 130MB mais l'un prend 40sec pour être traité alors que l'autre prend 75sec.
J'ai remarqué qu'un fichier contient 1,8 million de lignes et un autre 2,1 millions. Mais lorsque j'ai essayé de traiter un fichier de 3 millions de lignes de même taille, le traitement a pris 30 minutes.
Donc ma question est :
-
Est-ce que ce comportement est dû au temps de recherche du lecteur de mémoire tampon (je veux savoir comment le lecteur de mémoire tampon fonctionne) ?
BufferedReader
fonctionne ou analyse le fichier ligne par ligne ?) -
Existe-t-il un moyen de lire le fichier ligne par ligne de manière plus rapide ?
Ok les amis, je vous donne quelques détails supplémentaires.
Je divise la ligne en trois parties à l'aide d'une expression rationnelle, puis j'utilise la méthode suivante SimpleUnsortedWriter
(fourni par Cassandra) Je l'écris dans un fichier en tant que clé, colonne et valeur. Après le traitement des 16 Mo de données, elles sont effacées sur le disque.
Mais la logique de traitement est la même pour tous les fichiers, même un fichier d'une taille de 330MB mais avec moins de lignes, environ 1 million, est traité en 30 secondes. Quelle pourrait être la raison ?
deviceWriter = new SSTableSimpleUnsortedWriter(
directory,
keyspace,
"Devices",
UTF8Type.instance,
null,
16);
Pattern pattern = Pattern.compile("[\\[,\\]]");
while ((line = br.readLine()) != null)
{
//split the line i n row column and value
long timestamp = System.currentTimeMillis() * 1000;
deviceWriter .newRow(bytes(rowKey));
deviceWriter .addColumn(bytes(colmName), bytes(value), timestamp);
}
Ont changé -Xmx256M to -Xmx 1024M
mais ça ne sert à rien de toute façon.
Mise à jour : D'après mes observations, lorsque j'écris dans un tampon (dans la mémoire physique), le nombre d'écritures dans un tampon augmente et les nouvelles écritures prennent du temps. (C'est mon hypothèse)
Veuillez répondre.