2016-04-27 10 views
2

Ich bin auf der Suche nach den Wert verfügbar/frei Computer RAM in Swift 2.2. Ich habe gelesen this answer by Viktor Latypov, die this question vorgeschlagen. Leider stellte sich die Frage nach der "physikalischen Speichergröße" (Gesamtspeicher, d. H. 16 GB), aber ich suche nach "verfügbarem/freiem Speicher". Ich habe auch über die NSProcessInfo Klasse gelesen, aber die physicalMemory() Funktion ist nicht das, was ich suche.Erhalten Sie verfügbar/kostenlos RAM des Computers in Swift

Irgendwelche Ideen?

+0

Dies ist keine triviale Sache zu tun. Für ein funktionierendes Beispiel können Sie diesen Quellcode untersuchen: https://github.com/beltex/SystemKit – Moritz

+0

Wenn es Ihnen nichts ausmacht, in die Befehlszeile zu wechseln, liefert 'vm_stat' vielleicht genau das, wonach Sie suchen. Überprüfen Sie seine 'man' Seite für Details –

+0

@Code Verschiedene Ich bin vertraut mit' vm_stat'. Ich war eher auf der Suche nach einer nativen Methode, um freie RAM-Informationen über Swift zu erhalten, obwohl "vm_stat" ein letzter Ausweg ist, wenn es keine andere native Methode gibt. – perhapsmaybeharry

Antwort

1

Nachdem ich zu viel dafür ausgegeben habe, konnte ich nicht weiter gehen, also setze ich das, was ich bisher hier oben gesehen habe, in der Hoffnung, dass jemand helfen kann, es zu verbessern.

Sie können mit host_statistics Ergebnisse ähnlich wie vm_stat auf der Kommandozeile erhalten:

func vw_page_size() -> (kern_return_t, vm_size_t) { 
    var pageSize: vm_size_t = 0 
    let result = withUnsafeMutablePointer(&pageSize) { (size) -> kern_return_t in 
     host_page_size(mach_host_self(), size) 
    } 

    return (result, pageSize) 
} 

func vm_stat() -> (kern_return_t, vm_statistics) { 
    var vmstat = vm_statistics() 
    var count = UInt32(sizeof(vm_statistics)/sizeof(integer_t)) 
    let result = withUnsafeMutablePointers(&vmstat, &count) { (stat, count) -> kern_return_t in 
     host_statistics(mach_host_self(), HOST_VM_INFO, host_info_t(stat), count) 
    } 

    return (result, vmstat) 
} 


let (result1, pageSize) = vw_page_size() 
let (result2, vmstat) = vm_stat() 

guard result1 == KERN_SUCCESS else { 
    fatalError("Cannot get VM page size") 
} 
guard result2 == KERN_SUCCESS else { 
    fatalError("Cannot get VM stats") 
} 

let total = (UInt(vmstat.free_count + vmstat.active_count + vmstat.inactive_count + vmstat.speculative_count + vmstat.wire_count) * pageSize) >> 30 
let free = (UInt(vmstat.free_count) * pageSize) >> 20 

print("total: \(total)GB") 
print("free : \(free)MB") 

Der Gesamtspeicher ausgezählt auf weniger als das, was NSProcessInfo zurückkehrt. Auf meinem Mac mit 16 GB Arbeitsspeicher betrug die Summe etwa 15,6 GB.

Das Berechnen von freiem Speicher ist problematischer: Es gibt viele inaktive und löschbare Seiten, aber Mac OS X möchte sie nicht löschen, bis keine freie Seite mehr vorhanden ist. Obwohl es scheint, dass ich nur 450MB zur Verfügung habe, gibt es eine Menge mehr, die ich verwenden kann, wenn eine App es braucht. Und vergessen Sie nicht die Speicherkompression, die seit Mavericks (10.9) verfügbar ist!