La lecture et le traitement de grands volumes de texte fichier de 25 GO
Je dois lire un gros fichier texte, disons, 25 GO et de la nécessité de traiter ce dossier dans les 15 à 20 minutes. Ce fichier aura plusieurs d'en-tête et pied de page de la section.
J'ai essayé CSplit de découper ce fichier en-tête, mais c'est à prendre autour de 24 à 25 min de diviser en un certain nombre de fichiers sur la base de l'en-tête, ce qui n'est pas du tout acceptable.
J'ai essayé séquentielle de la lecture et de l'écriture à l'aide de BufferReader
et BufferWiter
avec FileReader
et FileWriter
. Il prend plus de 27 min. Encore une fois, il n'est pas acceptable.
J'ai essayé une autre approche comme obtenir l'index de début de chaque en-tête, puis exécuter plusieurs threads de lire le fichier à partir de l'emplacement spécifique en utilisant RandomAccessFile
. Mais pas de chance sur ce.
Comment puis-je obtenir mon exigence?
Double Possible de:
OriginalL'auteur user1142292 | 2012-01-11
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser un tampon de grande taille de lecture (par exemple, 20 MO au lieu de 2 MO) pour traiter les données plus rapidement. Aussi, ne pas utiliser un BufferedReader à cause de la lenteur des vitesses et des conversions de caractères.
Cette question a été posée avant: Lire les gros fichiers en Java
OriginalL'auteur collinjsimpson
Vous devez vous assurer que l'IO est assez rapide sans traitement car je soupçonne le traitement, et non l'OI est vous ralentir. Vous devriez être en mesure d'obtenir de 80 MO/s à partir d'un disque dur et jusqu'à 400 MB/s à partir d'un disque SSD. Cela signifie que vous pourriez lire l'intégralité en une seconde.
Essayez ce qui suit, qui n'est pas le plus rapide, mais le plus simple.
Sauf si vous trouvez que vous obtenez au moins 50 MO/s vous avez un problème matériel.
OriginalL'auteur Peter Lawrey
Essayez d'utiliser
java.nio
à faire un meilleur usage des systèmes d'exploitation de la fonctionnalité. Éviter de copier les données (par exemple, dans une chaîne de caractères), mais essayez de travailler avec décalages. Je crois que le java.nio classes ont même des méthodes pour transférer des données d'un tampon à l'autre sans tirer de ces données dans le java couche à tous (au moins sous linux), mais ce sera essentiellement de traduire dans les appels de système d'exploitation.Pour beaucoup des serveurs web modernes, cette technique a été la clé de la performance qu'ils peuvent servir de données statiques avec: essentiellement, ils déléguer autant que possible pour le système d'exploitation pour éviter de dupliquer il à la mémoire principale.
Permettez-moi de souligner ce: juste à la recherche par le biais de 25 GO d'octets de la mémoire tampon est beaucoup plus rapide que de le convertir en Cordes de Java (qui peut nécessiter un jeu de caractères d'encodage/décodage et à la reproduction). Tout ce qui vous permet d'économiser des copies et de la gestion de la mémoire aidera.
OriginalL'auteur Anony-Mousse
Si la plate-forme est droite, vous pouvez shell et l'appel téléphonique à une combinaison du chat et de la sed. Si elle n'est pas, vous pouvez toujours shell et perl via la ligne de commande. Pour le cas qui doit absolument être Java de faire le traitement, les autres ont suffisamment de réponses.
Être sur vos gardes, cependant, les bombardements n'est pas sans problèmes. Mais perl ou sed peut-être la seule largement les outils disponibles pour analyser et modifiez 25 go de texte dans votre calendrier.
OriginalL'auteur 0xCAFEBABE