Ограничение размера файла для read()?
У меня возникает проблема при загрузке больших файлов с помощью Python 3.5. Использование read()
без аргументов иногда давало OSError: Invalid argument
. Затем я попытался прочитать только часть файла, и, похоже, он работал нормально. Я решил, что он начнет сбой где-то около 2.2GB
, ниже приведен пример кода:
>>> sys.version
'3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44) \n[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]'
>>> x = open('/Users/username/Desktop/large.txt', 'r').read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
>>> x = open('/Users/username/Desktop/large.txt', 'r').read(int(2.1*10**9))
>>> x = open('/Users/username/Desktop/large.txt', 'r').read(int(2.2*10**9))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
Я также заметил, что этого не происходит в Python 2.7. Вот такой же код запускается в Python 2.7:
>>> sys.version
'2.7.10 (default, Aug 22 2015, 20:33:39) \n[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.1)]'
>>> x = open('/Users/username/Desktop/large.txt', 'r').read(int(2.1*10**9))
>>> x = open('/Users/username/Desktop/large.txt', 'r').read(int(2.2*10**9))
>>> x = open('/Users/username/Desktop/large.txt', 'r').read()
>>>
Я использую OS X El Capitan 10.11.1.
Является ли это ошибкой или должен использовать другой метод для чтения файлов?
Ответы
Ответ 1
Да, вы столкнулись с ошибкой.
Хорошей новостью является то, что кто-то еще ее нашел и уже создал для него проблему в Pugon tracker, см.: Issue24658 - open().write()
не удается на 2 ГБ + данные (OS X). По-видимому, это зависит от платформы (только для OS-X) и воспроизводится при использовании read
и/или write
. По-видимому, существует проблема с тем, как реализация fread.c
реализована в реализации libc для OS-X, см. здесь.
Плохая новость заключается в том, что она по-прежнему открыта (и в настоящее время неактивна), поэтому вам придется подождать, пока она не будет решена. В любом случае, вы можете по-прежнему взглянуть на обсуждение там, если вас интересует специфика.
В качестве решения я вполне уверен, что вы можете перекрыть проблему до тех пор, пока она не будет исправлена путем чтения фрагментов и цепочки блоков во время обработки. Делайте то же самое при написании. К сожалению, это может сделать трюк.