4

我编写了一个程序来生成大型 .SQL 文件,以便快速填充非常大的数据库。我用 PHP 编写了脚本。当我开始编码时,我使用的是fopen()fwrite()。当文件变得太大时,程序会将控制权返回给 shell,并且文件将不完整。

不幸的是,我不确定“太大”到底有多大。我认为它可能在 4GB 左右。

为了解决这个问题,我将文件显到标准输出。当我像这样调用程序时,我重定向了它:

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

这就像一个魅力。我的输出文件最终约为 10GB。

那么,我的问题是:fopen()fwrite()是否受文件系统的限制,它们能够生成多大的文件?如果是这样; 这是PHP的限制吗?其他语言也会出现这种情况吗?

4

4 回答 4

6

可能发生的是底层 PHP 构建是 32 位,无法处理 >4GB 的文件指针 - 请参阅此相关问题

您的底层操作系统显然能够存储大文件,这就是您能够将标准输出重定向到大文件的原因。

顺便说一句,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
于 2010-11-19T21:39:19.823 回答
2

是和不是。它不是直接受到限制的fopen()fwrite(),而是文件,它不能超过某些尺寸,具体取决于文件系统。查看Wikipedia 上的文件系统比较。

于 2010-11-19T21:33:58.440 回答
0

您的脚本是否可能执行时间过长并且已超时?

或者,您是否有可能达到脚本中的内存限制?

于 2010-11-19T21:39:03.347 回答
0

您可以在流中写入超过 2GB 的数据,而不是在文件中(因为文件的 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);

于 2016-07-01T15:54:13.663 回答