Ответ 1
Я на 99% уверен, что ваша проблема не в gzip.open()
, а в readlines()
.
Как в документации объясняется:
f.readlines() возвращает список, содержащий все строки данных в файле.
Очевидно, что это требует чтения и декомпрессии всего файла и создания абсолютно гигантского списка.
Скорее всего, на самом деле malloc
вызывает выделение всей памяти, которая ведется навсегда. И затем, в конце этой области (предполагая, что вы используете CPython), она должна GC, что весь гигантский список, который также займет навсегда.
Вы почти никогда не хотите использовать readlines
. Если вы не используете очень старый Python, просто выполните следующее:
for line in f:
A file
- это итерируемый полный строк, как и list
, возвращаемый readlines
- если он не является фактически list
, он генерирует больше строк "на лету", читая из буфера. Таким образом, в любой момент времени вы будете иметь только одну строку и пару буферов порядка 10 МБ, а не 25 ГБ list
. И чтение и распаковка будут распространяться по времени жизни цикла, а не делать все сразу.
Из быстрого теста, с файлом gzip на 3,5 ГБ, gzip.open()
работает мгновенно, for line in f: pass
занимает несколько секунд, gzip.close()
эффективно мгновенно. Но если я делаю for line in f.readlines(): pass
, это берет... ну, я не уверен, как долго, потому что через минуту моя система пошла на своп, прервав ад, и мне пришлось заставить убить переводчика, чтобы заставить его ответить на что-нибудь...
Так как это вызвало еще дюжину раз с момента этого ответа, я написал этот пост в блоге, который объясняет немного больше.