2016-04-17 13 views
4

Laut adressiert mein Julia-Programm 14,5 GB Speicher (die Spalte "VIRT" in der Ausgabe von top) und seine Größe im physischen Speicher beträgt 7,5 GB (die Spalte "RES"). Aber wenn ich Anrufe whos() in meinem Programm einfügen, wird nur etwa 100 MB Speicher entfielen:Warum benutzt mein Julia-Programm so viel Speicher?

   ArrayViews 190 KB  Module 
         Base 32427 KB  Module 
        Blosc  38 KB  Module 
        Calculus 178 KB  Module 
        Celeste 4034 KB  Module 
        Compat 126 KB  Module 
         Core 3268 KB  Module 
         DOC 1241 bytes ASCIIString 
       DataArrays 936 KB  Module 
       DataFrames 1817 KB  Module 
      Distributions 1245 KB  Module 
        DocOpt 221 KB  Module 
        Docile 420 KB  Module 
       DualNumbers  59 KB  Module 
        FITSIO 971 KB  Module 
        FileIO 592 KB  Module 
       ForwardDiff 304 KB  Module 
         GZip 588 KB  Module 
         HDF5 2698 KB  Module 
         JLD 335 KB  Module 
        Logging 103 KB  Module 
         Main 46514 KB  Module 
        NaNMath 121 KB  Module 
        Optim 475 KB  Module 
        PDMats 113 KB  Module 
        Reexport 3748 bytes Module 
     SortingAlgorithms  41 KB  Module 
       StatsBase 706 KB  Module 
       StatsFuns 289 KB  Module 
         WCS  78 KB  Module 
         main 8665 bytes Function 

Wie kann ich herausfinden, welche Datenstrukturen, die alle Speicher mit bis? Oder warum wird keine nicht referenzierte Erinnerung freigesetzt? (Ich bin auch gc() manchmal explizit aufrufen.)

+1

Julia wird keine Speicher verfolgen, die in 'ccall' zugewiesen wurden, was von Bibliotheken weit verbreitet ist. Leider kann dieser Speicher auch nicht automatisch von 'gc()' gesammelt werden. (Aber Bibliotheken sollten sie freigeben, wenn ihre Datenstrukturen 'gc()' red.) –

+1

Eine andere Datenstruktur, die in 'whos' nicht berücksichtigt wird, ist der Methodencache des gesamten JIT'-Codes. Es ist sehr schwierig zu sagen, was hier ohne den Code vor sich geht. –

Antwort

1

Zusammen mit den Einschränkungen von whos erwähnt von Matt B. und 张 实 唯, Vektoren in Julia sind anfällig für in whos underreported werden. Jeder Vektor benötigt insgesamt etwa 80 Byte Speicherplatz für das Header- und Vektor-Boxed-Objekt (auf einem 64-Bit-System), aber dieser Platz wird nicht von whos gezählt und kann sich definitiv addieren.

Zum Beispiel

julia> module Test 
      v = [[] for _ in 1:10000] 
     end 
Test 

julia> whos(Test) 
          Test  80 KB  Module 

Diese 80 KB ist ein wesentlicher underestimate, wie viel Speicher Test ist wirklich mit - es geht um eine Größenordnung ausgeschaltet ist. Überprüfen Sie daher, ob eine große Anzahl kleiner Vektoren in Ihrem Code erstellt wurde.

1

Wenn Sie Ihren Code profilieren und eine detaillierte Analyse der Speicherbelegung in Ihrem Programm erhalten möchten, finden Sie im Handbuch von Julia eine ausführliche Dokumentation unter http://docs.julialang.org/en/release-0.5/manual/profile/ zum Profiling Ihres Codes. Wenn Sie diese Schritte ausführen, können Sie Hotspots in Ihrem Code identifizieren, in denen viele Zuordnungen auftreten. Sie können auch das Makro @time verwenden. Wenn Sie jedoch nicht a priori wissen, wo Zuordnungen in Ihrem Code auftreten, kann es schwieriger sein, festzulegen, wo Sie das Makro platzieren sollen, um herauszufinden, wo Zuweisungen stattfinden.

Verwandte Themen