2016-12-24 5 views
10

У меня возникла проблема при загрузке больших файлов с помощью 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.

Является ли это ошибкой или должен использовать другой способ для чтения файлов?

+0

Я думаю, что емкость загрузки файла в основном зависит от того, сколько свободного места на вашем устройстве имеет в данный момент времени. – ZdaR

+0

Я думал, что это может быть проблемой, но: A) У меня 16 ГБ, и только сейчас 8. B) он отлично работает, если я переключаюсь на python2.7 –

+0

Из того, что показано в первом фрагменте вывода, оно выглядит как '>>> x = open ('/ Users/username/Desktop/large.txt', ' r '). read (int (2.1 * 10 ** 9)) 'работал, так как после его запуска не было создано' OSError'. Различные результаты также могут быть связаны с тем, что для создания интерпретатора Python использовались два разных компилятора. См. [_Настройка между LLVM, GCC 4.2 и Apple LLVM compiler 3.1_] (http://stackoverflow.com/questions/12020349/difference-between-llvm-gcc-4-2-and-apple-llvm-compiler-3- 1). – martineau

ответ

6

Да, вы наткнулись на ошибку.

Хорошие новости - это то, что кто-то еще его нашел и уже создал для него проблему в Pugon tracker, см .: Issue24658 - open().write() fails on 2 GB+ data (OS X). Это, по-видимому, зависит от платформы (только OS-X) и воспроизводится при использовании read и/или write. По-видимому, существует проблема с тем, как fread.c реализован в реализации libc для OS-X, см. here.

Bad News что он остается открытым (и, в настоящее время, неактивный), поэтому вам придется подождать, пока она не будет решена. В любом случае, вы можете по-прежнему взглянуть на дискуссию, если вы заинтересованы в деталях.


В качестве решения, я уверен, что вы можете бок шага вопроса, пока не будет устранен путем чтения кусков и цепочек кусков во время обработки. Делайте то же самое при написании. К сожалению, это может сделать трюк.

+0

Отчет об ошибке даже упоминает пост переполнения стека! что бы сделать python без SO? –

+3

@ Jean-FrançoisFabre, вероятно, будет намного более багги :-) –

Смежные вопросы