Не работает ли fread для больших файлов? - PullRequest
5 голосов
/ 30 сентября 2010

Я должен проанализировать файл 16 ГБ.Я читаю файл последовательно, используя fread() и fseek().Это возможно?fread() будет работать для такого большого файла?

Ответы [ 5 ]

6 голосов
/ 30 сентября 2010

Вы не упоминаете язык, поэтому я собираюсь предположить C.

Я не вижу проблем с fread, но fseek и ftell могут иметь проблемы.

Эти функции используют long int в качестве типа данных для хранения позиции файла, а не что-то интеллектуальное, например fpos_t или даже size_t. Это означает, что они могут не работать с файлом размером более 2 ГБ и, безусловно, могут работать с файлом размером 16 ГБ.

Вам нужно посмотреть, насколько велик long int на вашей платформе. Если это 64 бита, все в порядке. Если это 32, вы, вероятно, будете иметь проблемы при использовании ftell для измерения расстояния от начала файла.

Попробуйте вместо этого использовать fgetpos и fsetpos.

4 голосов
/ 30 сентября 2010

Спасибо за ответ. Я понял, где я иду не так. fseek() и ftell() не работают для файлов размером более 4 ГБ. Я использовал _fseeki64() и _ftelli64(), и теперь он работает нормально.

3 голосов
/ 30 сентября 2010

При правильном применении это не должно быть проблемой. Я предполагаю, что последовательно вы имеете в виду, что вы смотрите на файл в виде отдельных фрагментов и перемещаете указатель файла.

Выезд http://www.computing.net/answers/programming/using-fread-with-a-large-file-/10254.html

Похоже, он делал почти то же самое, что и вы.

2 голосов
/ 30 сентября 2010

Если вы работаете в системе POSIX-ish, вам необходимо убедиться, что вы создали свою программу с поддержкой смещения 64-битных файлов.POSIX предписывает (или, по крайней мере, разрешает, и большинство систем применяет это) реализации запретить операции ввода-вывода над файлами, размер которых не соответствует off_t, даже если единственный выполняемый ввод-вывод является последовательным без поиска.1003 * В Linux это означает, что вам нужно использовать -D_FILE_OFFSET_BITS=64 в командной строке gcc.

2 голосов
/ 30 сентября 2010

Это зависит от того, что вы хотите сделать. Если вы хотите прочитать все 16 ГБ данных в памяти, скорее всего, вам не хватит памяти или кучи приложения.

Скорее прочитайте порцию данных по порциям и выполните обработку этих порций (и освободите ресурсы, когда это будет сделано).

Но, помимо всего этого, решите, какой подход вы хотите использовать (используя fread() или istream и т. Д.), И проведите несколько тестов, чтобы определить, какой из них лучше для вас.

...