Сохраняет ли Python модуль tarfile архивы, которые он строит в памяти? - PullRequest
6 голосов
/ 10 марта 2011

Я работаю в среде с ограниченным объемом памяти, где мне нужно создавать архивы дампов SQL. Если я использую встроенный в Python модуль tarfile , сохраняется ли файл '.tar' в памяти или записывается на диск при его создании?

Например, в следующем коде, если huge_file.sql равно 2 ГБ, переменная tar займет 2 ГБ в памяти?

import tarfile

tar = tarfile.open("my_archive.tar.gz")), "w|gz")
tar.add('huge_file.sql')
tar.close()

1 Ответ

5 голосов
/ 10 марта 2011

Нет, он не загружается в память.Вы можете прочитать исходный файл для tarfile , чтобы увидеть, что он использует copyfileobj, который использует буфер фиксированного размера для копирования из файла в tarball:

def copyfileobj(src, dst, length=None):
    """Copy length bytes from fileobj src to fileobj dst.
       If length is None, copy the entire content.
    """
    if length == 0:
        return
    if length is None:
        shutil.copyfileobj(src, dst)
        return

    BUFSIZE = 16 * 1024
    blocks, remainder = divmod(length, BUFSIZE)
    for b in xrange(blocks):
        buf = src.read(BUFSIZE)
        if len(buf) < BUFSIZE:
            raise IOError("end of file reached")
        dst.write(buf)

    if remainder != 0:
        buf = src.read(remainder)
        if len(buf) < remainder:
            raise IOError("end of file reached")
        dst.write(buf)
    return
...