php - PHP不会将完整文件读入数组,只有部分
问题描述
我有一个包含 3,200,000 行 csv 数据(有 450 列)的文件。总文件大小为 6 GB。
我读了这样的文件:
$data = file('csv.out');
毫无疑问,它只读取了 897,000 行。我用 'print_r' 和echo sizeof($data)
. 我将“memory_limit”增加到了一个荒谬的值,例如 80 GB,但没有任何区别。
现在,它确实读入了我的另一个大文件,行数相同(3,200,000),但只有几列,因此总文件大小为 1.1 GB。所以这似乎是一个总文件大小问题。仅供参考,$data 数组中的 897,000 行约为 1.68 GB。
更新:我将第二个(较长的)文件增加到 2.1 GB(超过 500 万行),它可以很好地读取它,但将另一个文件截断为 1.68 GB。所以看起来不是大小问题。如果我继续将第二个文件的大小增加到 2.2 GB,而不是截断它并继续程序(就像它对第一个文件所做的那样),它会死掉并转储核心。
更新:我通过打印整数和浮点数验证了我的系统是 64 位的:
<?php
$large_number = 2147483647;
var_dump($large_number); // int(2147483647)
$large_number = 2147483648;
var_dump($large_number); // float(2147483648)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number); // float(50000000000)
$large_number = 9223372036854775807;
var_dump($large_number); //
int(9223372036854775807)
$large_number = 9223372036854775808;
var_dump($large_number); //
float(9.2233720368548E+18)
$million = 1000000;
$large_number = 50000000000000 * $million;
var_dump($large_number); // float(5.0E+19)
print "PHP_INT_MAX: " . PHP_INT_MAX . "\n";
print "PHP_INT_SIZE: " . PHP_INT_SIZE . " bytes (" . (PHP_INT_SIZE * 8) . " bits)\n";
?>
该脚本的输出是:
整数(2147483647)
整数(2147483648)
整数(50000000000)
整数(9223372036854775807)
浮动(9.2233720368548E+18)
浮动(5.0E+19)
PHP_INT_MAX:9223372036854775807
PHP_INT_SIZE:8 字节(64 位)
那么既然它是 64 位的,而且内存限制设置得非常高,为什么 PHP 不读取大于 2.15 GB 的文件?
解决方案
想到的一些事情:
- 如果您使用的是 32 位 PHP,则无法读取大于 2GB 的文件。
- 如果读取文件花费的时间太长,可能会出现超时。
- 如果文件真的很大,那么将其全部读入内存将是有问题的。通常最好读取数据块并进行处理,除非您需要随机访问文件的所有部分。
- 另一种方法(我过去使用过)是将大文件切成更小、更易于管理的文件(例如,如果它是一个简单的日志文件,应该可以工作)
推荐阅读
- python - 可变对象上的递归函数
- c# - 带有 Nuget 包的多个 Microsoft.Owin 版本
- php - 如何通过 MySql 查询结果中的循环输入表单(动态)发布 Ajax onClick
- amazon-web-services - 在 terraform 中创建 AWS 实例时如何使用 user_data url?
- php - 如何同步两个日期字段输入。一个漂移,需要一些指导
- python - pytest monkeypatch 终端大小
- c# - 如何编写没有根元素的碎片化 xml 文件?
- wordpress - WordPress + ngrok 的问题,我使用 WAMPServer
- ios - Swift - 什么是 SCNCamera 的定义和用途
- python - "是什么意思
's'>" 是什么意思?