Drahtlose Netzwerke sind überall: Zu Hause, im Café und in der Firma. Im Gegensatz zu Kabelnetzen verliert der Admin bei WLANs allerdings schnell die ... (mehr)

Namensgedächtnis

Weiterhin steht für jedes unterschiedliche Argument – oder je nach Funktion unterschiedliche Kombinationen mehrerer Argumente – ein eigenes Unterverzeichnis zur Verfügung. Es trägt den Namen eines Hash-Werts der übergebenen Argumente und enthält zwei Dateien: »input_args.json« und »output.pkl« . Die erste offenbart die Eingabeargumente im für Menschen lesbaren JSON-Format, die zweite das zugehörige Ergebnis im binären Pickle-Format, das Python zur Serialisierung und zum Speichern von Objekten verwendet.

Diese Struktur macht den Zugriff auf die von Memory zwischengespeicherten Funktionsergebnisse angenehm transparent. So liest etwa das Python-Modul »pickle« das Ergebnis im Python-Interpreter wieder ein:

import pickle
result = pickle.load(open("output.pkl"))

Memory räumt am Programmende aber nicht selbstständig auf. Das heißt, dass gespeicherte Ergebnisse auch beim nächsten Programmstart weiterhin zur Verfügung stehen. Es bedeutet aber auch, dass man den Festplattenplatz bei Bedarf selbst wieder freigeben muss. Das geschieht entweder durch den Aufruf der »clear()« -Methode des verwendeten Memory-Objekts oder indem man das entsprechende Verzeichnis einfach löscht.

Daneben gilt es zu beachten, dass sich Memory beim Auslesen der gespeicherten Ergebnisse ausschließlich am Namen der Funktion orientiert. Ändert man deren Implementation, gibt Memory beim nächsten Start womöglich fälschlicherweise die zuvor von der alten Version der Funktion erzeugten Ergebnisse erneut aus. Des Weiteren funktioniert Memory nicht mit »lambda« -Funktionen, also namenlosen Funktionen, die direkt beim Aufruf definiert werden.

Generell empfiehlt sich der Einsatz der Memory-Klasse vor allem bei Funktionen, deren Ergebnisse so groß sind, dass sie den Arbeitsspeicher über Gebühr belasten. Produziert eine häufig aufgerufene Funktion hingegen nur kleine Ergebnisse, empfiehlt es sich eher, beispielsweise einen Dictionary-basierten Cache im Arbeitsspeicher einzurichten. [2] zeigt dafür eine Beispielimplementation.

Schnell und sparsam

Die Memory-Klasse verwendet auf Wunsch ein Verfahren, das bei großen gespeicherten Objekten viel Zeit spart: Memory Mapping. Die Kernidee dieses Konzepts besteht darin, eine Datei als Bit-für-Bit-Kopie eines Objekts aus dem Arbeitsspeicher auf die Festplatte zu schreiben. Wenn die Software das Objekt wieder öffnet, kopiert sie den relevanten Teil der Datei in einen zusammenhängenden Speicherbereich, sodass die darin enthaltenen Objekte direkt zur Verfügung stehen. Das erspart dem System die Allokation von Speicher und damit unter Umständen viele Systemaufrufe.

Joblib greift auf die vom Python-Modul Numpy [3] bereitgestellte Memory-Mapping-Methode zurück. Der Konstruktor der Memory-Klasse nimmt mit dem optionalen Parameter »mmap_mode« dieselben Argumente wie die Klasse »numpy.memmap« entgegen: »r+« , »r« , »w+« und »c« .

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023