Après avoir essayé d'importer la bibliothèque d'exécution Java de base rt.jar avec language-java-classfile, j'ai découvert qu'elle utilisait d'énormes quantités de mémoire.Forçage du traitement séquentiel dans Data.Binary.Get de Haskell
J'ai réduit le programme démontrant le problème à 100 lignes et l'ai téléchargé à hpaste. Sans forcer l'évaluation de stream
à la ligne # 94, je n'ai aucune chance de l'exécuter parce qu'elle me dévore toute la mémoire. Forcing stream
avant de passer à getClass
finitions, mais utilise encore d'énormes quantités de mémoire:
34,302,587,664 bytes allocated in the heap
32,583,990,728 bytes copied during GC
139,810,024 bytes maximum residency (398 sample(s))
29,142,240 bytes maximum slop
281 MB total memory in use (4 MB lost due to fragmentation)
Generation 0: 64992 collections, 0 parallel, 38.07s, 37.94s elapsed
Generation 1: 398 collections, 0 parallel, 25.87s, 27.78s elapsed
INIT time 0.01s ( 0.00s elapsed)
MUT time 37.22s (36.85s elapsed)
GC time 63.94s (65.72s elapsed)
RP time 0.00s ( 0.00s elapsed)
PROF time 13.00s (13.18s elapsed)
EXIT time 0.00s ( 0.00s elapsed)
Total time 114.17s (115.76s elapsed)
%GC time 56.0% (56.8% elapsed)
Alloc rate 921,369,531 bytes per MUT second
Productivity 32.6% of total user, 32.2% of total elapsed
Je pensais que le problème était le ConstTable
s restant autour, donc j'ai essayé de forcer cls
en ligne # 94 ainsi. Mais cela ne fait que la consommation de mémoire et le temps d'exécution pire:
34,300,700,520 bytes allocated in the heap
23,579,794,624 bytes copied during GC
487,798,904 bytes maximum residency (423 sample(s))
36,312,104 bytes maximum slop
554 MB total memory in use (10 MB lost due to fragmentation)
Generation 0: 64983 collections, 0 parallel, 71.19s, 71.48s elapsed
Generation 1: 423 collections, 0 parallel, 344.74s, 353.01s elapsed
INIT time 0.01s ( 0.00s elapsed)
MUT time 40.60s (42.38s elapsed)
GC time 415.93s (424.49s elapsed)
RP time 0.00s ( 0.00s elapsed)
PROF time 56.53s (57.71s elapsed)
EXIT time 0.00s ( 0.00s elapsed)
Total time 513.07s (524.58s elapsed)
%GC time 81.1% (80.9% elapsed)
Alloc rate 844,636,801 bytes per MUT second
Productivity 7.9% of total user, 7.7% of total elapsed
Donc, ma question est fondamentalement, comment puis-je forcer le traitement séquentiel des fichiers concernés, de sorte qu'après chacun est traité, seul le résultat de la chaîne (cls
) reste en mémoire?
Que diriez-vous certains profils de tas et postez ce graphique dans votre question. –
J'ai ajouté la sortie de profilage de tas pour les deux versions à hpaste. – Cactus
Avez-vous essayé d'utiliser le paquet 'cereal' à la place? Juste une pensée, mais strictes bytestrings aident souvent si vous savez que le fichier est assez petit. –