Pregunta

Me escribió un programa para generar grandes archivos .SQL para poblar rápidamente grandes bases de datos. Yo con guión en PHP. Cuando empecé codificación que estaba usando fopen () y fwrite () . Cuando los archivos se ponían demasiado grande el programa devuelve el control a la cáscara y el archivo no estaría completo.

Por desgracia no estoy seguro exactamente qué tan grande es 'demasiado grande'. Creo que puede haber sido de alrededor de 4 GB.

Para resolver este problema que tenía el archivo echo en la salida estándar. Me redirigí que cuando me llamó el programa de este modo:

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

Lo que funcionó de maravilla. Mi archivo de salida terminó siendo alrededor de 10 GB.

Mi pregunta, entonces, es: ¿ fopen () y fwrite () limitado por el sistema de archivos en términos de cómo archivo de una gran son capaces de generar? Si es así; se trata de una limitación de PHP? ¿Esto sucede en otros idiomas así?

¿Fue útil?

Solución

Lo que está ocurriendo, probablemente, es la instalación de PHP subyacente es de 32 bits y no puede manejar apuntadores de archivo> 4 GB - ver esta relacionado pregunta .

Su sistema operativo subyacente es, obviamente, capaz de almacenar archivos de gran tamaño, que usted es capaz de redirigir la salida estándar a un archivo de gran tamaño.

¿Por qué

A propósito, un archivo SQL es probable que sea altamente compresible, por lo que le gustaría considerar el uso de la gzip fopen envoltorio para comprimir el archivo mientras lo escribes.

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

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

fclose($f);

Su volcado será una fracción del tamaño original, y se puede restaurar simplemente tubería de la salida de zcat en un cliente de SQL, por ejemplo, para MySQL

zcat /path/to/my/file.sql.gz | mysql mydatabase

Otros consejos

Sí y no. No es fopen () o fwrite () que se limitan directamente, sus archivos, los cuales no podrán exceder algunas dimensiones en función del sistema de archivos. Echar un vistazo a Comparación de los sistemas de archivos en la Wikipedia.

¿Es posible que el script está tomando demasiado tiempo para ejecutar y ha agotado el tiempo?

Como alternativa, es posible que usted está alcanzando sus límites de memoria dentro de la escritura?

Puede escribir más de 2 GB de datos en un corriente , no en un archivo (como el puntero interno fseek del archivo está excediendo los límites de PHP, y las corrientes son por lo general no seekable)

<? $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);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top