Могут ли mmap и gzip сотрудничать? - PullRequest
8 голосов
/ 26 февраля 2011

Я пытаюсь понять, как использовать mmap со сжатым файлом gzip.Это вообще возможно?

import mmap
import os
import gzip

filename = r'C:\temp\data.gz'

file = gzip.open(filename, "rb+")
size = os.path.getsize(filename)

file = mmap.mmap(file.fileno(), size)

print file.read(8)

Выходные данные сжаты.

Ответы [ 2 ]

12 голосов
/ 30 июля 2011

Вы можете сделать easilly.Действительно, модуль gzip получает в качестве необязательного аргумента файлоподобный объект.

import mmap
import gzip

filename = "a.gz"
handle = open(filename, "rb")
mapped = mmap.mmap(handle.fileno(), 0, access=mmap.ACCESS_READ)
gzfile = gzip.GzipFile(mode="r", fileobj=mapped)

print gzfile.read()

То же самое относится и к модулю tarfile:

import sys
import mmap
import tarfile

f = open(sys.argv[1], 'rb')
fo = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
tf = tarfile.open(mode='r:gz', fileobj=fo)

print tf.getnames()
12 голосов
/ 26 февраля 2011

Ну, не так, как вы хотите.

mmap () может использоваться для доступа к сжатому файлу, если вам нужны сжатые данные.

mmap () - это системный вызов для отображения дисковых блоков в ОЗУ почти так же, как если бы вы добавляли своп.

Невозможно отобразить несжатые данные в ОЗУ с помощью mmap (), поскольку их нет на диске.

...