Seite 1 von 1

Größere Anzahl Dateien in ein komprimiertes Tarfile

Verfasst: Dienstag 11. Oktober 2016, 11:37
von api
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

Re: Größere Anzahl Dateien in ein komprimiertes Tarfile

Verfasst: Dienstag 11. Oktober 2016, 12:25
von Sirius3
@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.

Re: Größere Anzahl Dateien in ein komprimiertes Tarfile

Verfasst: Dienstag 11. Oktober 2016, 12:34
von DasIch
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.

Re: Größere Anzahl Dateien in ein komprimiertes Tarfile

Verfasst: Dienstag 11. Oktober 2016, 12:57
von Sirius3
@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

Re: Größere Anzahl Dateien in ein komprimiertes Tarfile

Verfasst: Dienstag 11. Oktober 2016, 14:00
von api
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...