Ограничена ли fopen () файловой системой? - PullRequest
4 голосов
/ 20 ноября 2010

Я написал программу для генерации больших файлов .SQL для быстрого заполнения очень больших баз данных.Я написал это в PHP.Когда я начал кодировать, я использовал fopen () и fwrite () .Когда файлы становятся слишком большими, программа возвращает управление оболочке, и файл становится неполным.

К сожалению, я точно не знаю, насколько велика «слишком большая».Я думаю, что это могло быть около 4 ГБ.

Для решения этой проблемы у меня был файл echo для stdout.Я перенаправил его, когда назвал программу так:

[root@localhost]$ php generatesql.php > myfile.sql

, которая работала как шарм.Мой выходной файл оказался около 10 ГБ.

Тогда мой вопрос таков: ограничены ли fopen () и fwrite () файловой системой с точки зрения размера файла, который они могут создать?Если так;это ограничение PHP?Это происходит и на других языках?

Ответы [ 4 ]

6 голосов
/ 20 ноября 2010

Вероятно, происходит то, что базовая сборка PHP является 32-битной и не может обрабатывать файловые указатели> 4 ГБ - посмотрите этот связанный вопрос .

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

Между прочим, файл SQL может быть очень сжимаемым, поэтому вы можете рассмотреть возможность использования оболочки gzip fopen сжать файл, как вы пишете.

$file = 'compress.zlib:///path/to/my/file.sql.gz';
$f = fopen($file, 'wb');

    //just write as normal...
    fwrite($f, 'CREATE TABLE foo (....)');

fclose($f);

Ваш дамп будет частью исходного размера, и вы можете восстановить его, просто отправив вывод из zcat в клиент SQL, например, для mysql

zcat /path/to/my/file.sql.gz | mysql mydatabase
2 голосов
/ 20 ноября 2010

Да и нет. Это не fopen () или fwrite () , которые ограничены напрямую, это файлы, которые не могут превышать некоторые размеры в зависимости от файловой системы. Взгляните на Сравнение файловых систем в Википедии.

0 голосов
/ 01 июля 2016

Вы можете записать более 2 ГБ данных в потоке , а не в файле (поскольку внутренний указатель файла fseek превышает ограничения PHP, а потоки обычно не являются доступной для поиска)

<? $target = fopen('test.tar', 'w'); //this is a file, limited by php to 2GB $body = str_repeat("===", 1024 * 1024); while(true) fwrite($target, $test);

<? $target = popen('cat > test.tar', 'w'); //this is a stream, no limitation here $body = str_repeat("===", 1024 * 1024); while(true) fwrite($target, $test);

0 голосов
/ 20 ноября 2010

Возможно ли, что выполнение вашего скрипта занимает слишком много времени и истекло время ожидания?

В качестве альтернативы, возможно ли, что вы достигли пределов памяти в скрипте?

...