Größere Anzahl Dateien in ein komprimiertes Tarfile

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Hallo zusammen,

ich möchte gerne ca. 1 Million Dateien in einem komprimierten (gzip) Tarfile zusammenpacken. Die Namen der Dateien stehen in der Datei FILES_TO_BE_ARCHIVED_FILE. Die Zeile "tar_arch.members = []" habe ich eingefügt, um den Speicherverbrauch etwas zu reduzieren.

Mein Versuch sieht folgendermaßen aus:

Code: Alles auswählen

  FILES_TO_BE_ARCHIVED_FILE=os.path.join("/tmp", "tt1.out")
  TAR_FILE=os.path.join("/tmp", "TT_Archive"  + ".tar.gz")

  with closing(tarfile.open(TAR_FILE, "w:gz")) as tar_arch:
    with open(FILES_TO_BE_ARCHIVED_FILE, "r") as out_arch:
      for filename in out_arch:
        tar_arch.add(filename.strip('\n'))
        tar_arch.members = []
Im Prinzip funktioniert das auch - aber nur für die ersten 167.000 Dateien. Dann gibt es einen Core-Dump - wahrscheinlich, weil diese Methode zuviel Speicher braucht.

Ich verwende: Python 2.6.4 auf einem AIX-UNIX-System.

Hat jemand eine Idee, wie ich das mit dem Speicher besser in den Griff bekomme?

CU,
API
Zuletzt geändert von Anonymous am Dienstag 11. Oktober 2016, 11:52, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@api: Ob der Speicher voll läuft siehst Du ja daran, ob der Speicher langsam immer weiter wächst. Dann müßte aber ein Memory-Error kommen, außer irgendwo ist etwas unsauber programmiert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Ein MemoryError dürfte nur auftreten wenn malloc einen Fehler produziert. Das passiert eigentlich bei modernen Betriebssystemen nicht, zumindest nicht wenn einfach nur kein Speicher mehr vorhanden ist.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@DasIch: gucks Du da:

Code: Alles auswählen

>>> '0'*1000*1000*1000*1000
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Nun ja, ich vermute ja nur einen Speicher-Fehler. Vorher hatte ich den Code ohne die Zeile

Code: Alles auswählen

 tar_arch.members = []
ausprobiert. Dort gab es dann schon bei ca. 87.000 Dateien den CoreDump.

Einen Memory-Error habe ich nicht bekommen, aber auch sonst keinen Fehler - nur halt den Core-Dump...
Antworten