Traitement de gros fichiers en java

J’ai un énorme fichier d’environ 10 Go. Je dois faire des opérations telles que sortinger, filtrer, etc. sur les fichiers en Java. Chaque opération peut être effectuée en parallèle.

Est-il bon de démarrer 10 threads et de lire le fichier en parallèle? Chaque thread lit 1 Go du fichier. Existe-t-il une autre option pour résoudre le problème des fichiers très volumineux et les traiter le plus rapidement possible? NIO est-il bon pour de tels scénarios?

Actuellement, j’effectue des opérations en série et le traitement de tels fichiers prend environ 20 minutes.

Merci,

Est-il bon de démarrer 10 threads et de lire le fichier en parallèle?

Presque certainement pas – bien que cela dépende. Si c’est d’un SSD (où il n’y a effectivement pas de temps à chercher), alors peut-être . Si c’est un disque traditionnel, certainement pas.

Cela ne signifie pas pour autant que vous ne pouvez pas utiliser plusieurs threads – vous pouvez éventuellement créer un thread pour lire le fichier, en effectuant uniquement les tâches les plus rudimentaires pour obtenir les données en morceaux pouvant être traités. Utilisez ensuite une queue producteur / consommateur pour permettre à plusieurs threads de traiter les données.

Sans en savoir plus que “sortinger, filtrer, etc.” (ce qui est assez vague), nous ne pouvons pas vraiment dire à quel point le processus est parallélisable – mais essayer d’exécuter l’IO en parallèle sur un seul fichier ne sera probablement pas utile.

Essayez de profiler le code pour voir où se trouvent les goulots d’étranglement. Avez-vous essayé de faire lire le fichier entier par un thread (ou autant que possible) et de le donner à 10 threads pour traitement? Si les entrées / sorties de fichiers constituent votre goulot d’étranglement (ce qui semble plausible), cela devrait améliorer votre temps d’exécution global.