Je veux lire des fichiers texte et convertir chaque mot à un certain nombre. Ensuite, pour chaque fichier, écrivez une séquence de nombres au lieu d'un mot dans un nouveau fichier. J'ai utilisé un HashMap à attribué un seul numéro (identifiant) pour chaque mot, par exemple, le mot pomme est attribué au numéro donc chaque fois, je vois pomme dans un fichier texte que j'écris dans la séquence. Je n'ai besoin que d'une seule HashMap pour éviter d'affecter plus d'un identifiant à un mot. J'ai écrit le code suivant mais il traite le fichier lentement. Par exemple, la conversion d'un fichier texte de taille 165,7 Mo en un fichier de séquence a pris 20 heures. J'ai besoin de convertir 600 fichiers texte avec la même taille pour les fichiers de séquence. Je veux savoir s'il existe un moyen d'améliorer l'efficacité de mon code. La fonction suivante est appelée pour chaque fichier texte.améliorer la vitesse de lecture et d'écriture de gros fichiers avec Buffered écriture/lecteur
public void ConvertTextToSequence(File file) {
try{
FileWriter filewriter=new FileWriter(path.keywordDocIdsSequence,true);
BufferedWriter bufferedWriter= new BufferedWriter(filewriter);
String sequence="";
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line = bufferedReader.readLine();
while(line!=null)
{
StringTokenizer tokens = new StringTokenizer(line);
String str;
while (tokens.hasMoreTokens())
{
str = tokens.nextToken();
if(keywordsId.containsKey(str))
sequence= sequence+" "+keywordsId.get(stmWord);
else
{
keywordsId.put(str,id);
sequence= sequence+" "+id;
id++;
}
if(keywordsId.size()%10000==0)
{
bufferedWriter.append(sequence);
sequence="";
start=id;
}
}
String line = bufferedReader.readLine();
}
}
if(start<id)
{
bufferedWriter.append(sequence);
}
bufferedReader.close();
fileReader.close();
bufferedWriter.close();
filewriter.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
Le constructeur de cette classe est:
public ConvertTextToKeywordIds(){
path= new LocalPath();
repository= new RepositorySQL();
keywordsId= new HashMap<String, Integer>();
id=1;
start=1;}
Ce code ne serait pas compilé. Si vous voulez vous dire pourquoi votre code réel est lent, postez votre vrai code. Ce que je peux déjà dire est que l'ajout à une chaîne et l'attente de la carte pour avoir 10000 éléments avant d'écrire la chaîne à l'écrivain est très, très productif. Ecrire directement à l'écrivain, et laissez-le faire son travail: mise en mémoire tampon. –
@JBNizet mon vrai code est vraiment gros et compliqué car je nettoie chaque jeton avant de l'insérer dans HashMap. Je résous une erreur dans mon code je pense que vous pouvez compiler la fonction maintenant. – Suri