Maison > Questions et réponses > le corps du texte
参考:
有一个1G大小的一个文件,内存限制大小是10M,有序返回频数最高的50个词,该怎么做?
网上有很多该问题的解决方案,都是用分而治之的思想,提到了遍历整个文件。
那么我的问题是:
如果单纯地逐行读取大文件,算是把1G文件全都加载进内存吗?
或者说是读取大于内存的文件应该怎么读?
黄舟2017-04-18 10:57:16
Ici la mémoire est comme un tuyau. La lecture ligne par ligne consiste simplement à faire passer le fichier 1G dans la mémoire. 10M représente l'épaisseur du tuyau.
Ainsi, la lecture ligne par ligne nécessite 1 Go de 加载进去过
mémoire de fichier.
伊谢尔伦2017-04-18 10:57:16
try (BufferedReader in = new BufferedReader(new FileReader(file))) {
String line;
while ((line = in.readLine()) != null) {
// parse line
}
}
Peu importe la taille du fichier, tant que la longueur de chaque ligne est limitée, la lecture de l'intégralité du fichier prendra beaucoup de temps, mais cela ne prendra pas trop de mémoire.
伊谢尔伦2017-04-18 10:57:16
Lire en morceaux, lire un ensemble de résultats pour chaque morceau et enfin agréger l'ensemble de résultats
Lors du traitement du texte, il sera préférable de connaître le nombre de lignes
高洛峰2017-04-18 10:57:16
linux
Il existe une commande ci-dessus appelée split
qui peut diviser rapidement et simultanément un texte volumineux en petits fichiers, puis le traitement est pratique. Cet algorithme est appelé tri externe
怪我咯2017-04-18 10:57:16
La mémoire est comme du papier brouillon. Lorsque vous avez fini d'écrire un article, retournez-le. Les données utilisées et inutilisées sont jetées.
Un exemple simple, créez une variable buff, définissez sa taille, ouvrez le flux de fichiers et remplissez-le. Une fois rempli, vérifiez le contenu souhaité. S'il est trouvé, il sera compté dans une autre variable. Effacez ensuite le buff et continuez à charger le contenu à la position précédemment lue... Jusqu'à ce que la lecture soit terminée, les statistiques sont complétées.
阿神2017-04-18 10:57:16
Pour différents systèmes, une API sera fournie pour faire fonctionner les fichiers plus grands que la mémoire, c'est-à-dire que le fichier sera traité comme de la mémoire :
内存映射
mmap
Créer un mappage de fichiers