c максимальный размер файла для чтения в Ubuntu - PullRequest
1 голос
/ 09 января 2011

Мне было интересно, как установить размер буфера [] для чтения файлов в Ubuntu.

Кто-нибудь знает максимальный размер, который можно прочитать, используя файловые дескрипторы read () из файла.

Я попробовал 1 ГБ и получил ошибку сегментации, попробовал 4 МБ, это нормально.

Не знаете, какой буфер символов [BUFSIZ] имеет разный размер на разных платформах?

Какие-либо предложения о том, какой размер буфера будет наилучшим для установки буфера?

Спасибо

Ответы [ 5 ]

3 голосов
/ 09 января 2011

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

Чтение больших файлов в память также может быть нежелательным, но если вам необходимо, то вам, возможно, стоит сначала изучить stat() и *Функция 1004 * позволяет определить, насколько велик размер файла, а затем динамически распределять буфер с помощью malloc() / calloc() или использовать mmap().

Возможно, вы также можете найти информацию о том, как использовать Google.эти функции.Также должна быть информация о других способах получения размера файла.

Но если вы можете избежать этого, не читайте огромные файлы в память.Скорее, читайте биты за раз и обрабатывайте их так, как вы бы это делали.

3 голосов
/ 09 января 2011

Полученная вами ошибка сегментации не имеет ничего общего с максимальными размерами файлов. Скорее, вы выделяете буфер в стеке, который превышает пространство стека вашей программы.

Когда вы объявляете массив как:

char buffer[BUFSIZ];

... он выделяет BUFSIZ байтов в стеке . Количество стекового пространства, которое у вас есть, варьируется в зависимости от вашей платформы и компилятора, но обычно это не что-то вроде 1 ГБ. В некоторых дистрибутивах Linux с gcc размер стека по умолчанию составляет 8 МБ.

Если вам нужно выделить большой буфер для чтения файла, вам нужно выделить его в куче, используя одну из функций семейства malloc.

char* buffer = malloc(BUFSIZ);

Помните, что вам также понадобится освободить буфер, когда вы закончите его использовать.

free(buffer);
0 голосов
/ 09 января 2011

Не забывайте, что каждый тип файловой системы имеет свои ограничения размера файла:

  • Общая параллельная файловая система IBM = 2 ^ 99
  • XFS = 8 EiB = 8 * 2 ^ 60
  • OCFS = 4 PiB = 4 * 2 ^ 50
  • ext4 = 16 TiB = 16 * 2 ^ 40
  • ext2 / ext3 = 2 TiB = 2 * 2 ^ 40
0 голосов
/ 09 января 2011

Чтение максимального размера не обязательно является наиболее эффективным. Как правило, ОС выполняет буферизацию снизу, поэтому запрашиваемый размер не всегда очень важен. Тем не менее, чтение размера сектора (часто 4 КБ) является хорошим размером для последовательного чтения.

0 голосов
/ 09 января 2011

Не читайте это сразу.Размер буфера на самом деле зависит от того, сколько вы можете выделить.т.е. несколько МБ с использованием стека и практически неограниченное использование malloc (благодаря виртуальной памяти): в этом последнем случае, если ваш файл занимает несколько ГБ, вам потребуется столько памяти.используя read / fread, и вы будете в безопасности.Никто не хочет заполнять его память только для чтения файла.4 КБ - это хороший размер буфера, потому что обычно это размер страницы памяти.И вы можете легко разместить его в стеке без использования ошибки.

...