Php get_file_content()耗尽了允许的内存大小(正在读取.dat文件)

Php get_file_content()耗尽了允许的内存大小(正在读取.dat文件),php,memory-size,Php,Memory Size,我在运行php脚本时遇到了麻烦 我试图使用get\u file\u content()从.dat文件中读取数据 这是我的代码: $file='abc.dat'; $data=文件\获取\内容($file) 但是当它给我带来像 致命错误:允许的内存大小为67108864字节,在/ 我尝试了很多解决方法,比如 ini_集('memory_limit','128M'),初始化集(“最大执行时间”,“0”) 但这对我不起作用 我已经把我的php文件上传到一个webhost上了。 当我在localhost

我在运行php脚本时遇到了麻烦

我试图使用get\u file\u content()从.dat文件中读取数据

这是我的代码:

$file='abc.dat';
$data=文件\获取\内容($file)

但是当它给我带来像

致命错误:允许的内存大小为67108864字节,在/

我尝试了很多解决方法,比如 ini_集('memory_limit','128M')初始化集(“最大执行时间”,“0”)

但这对我不起作用

我已经把我的php文件上传到一个webhost上了。 当我在localhost上运行脚本时,一切都很顺利

有人能帮我吗。。。??有没有其他方法可以读取我的长文件

编辑:

是的,我真的需要一个数组中的全部数据

代码背后的概念是PHP中的人脸检测和比较。这是人脸检测的代码,请给我任何建议

<?php


ini_set('max_execution_time', 123456);

您可以像下面这样使用缓冲区:
如果可以在while循环中处理数据,则:

$f = fopen('abc.dat', 'r');
$data = '';
while ($buffer =  fread($f, 8192)) do_some_processing($buffer);
fclose($f);

您的内存限制似乎设置为64MB。在脚本运行时,能否确认内存限制确实为128M:

var_dump(ini_get('memory_limit'));
如果不是128M,您使用的主机是什么?通常,这可以通过htaccess来实现:

php_value memory_limit 128M
如果这还不能解决问题,您需要联系您的主机提供商(如果您不想透露主机提供商的名称,我们无法帮助您提供确切的ode)以提高内存限制。

您真的需要同时将所有文件加载到内存中吗?如果是这样的话,那么你需要和你的主机谈谈如何增加你的内存限制,他们可能会告诉你升级你的计划或转移到VPS

理想情况下,无论您在做什么,您都应该使用最小的数据块。例如:

$myfile = '/path/to/file.dat';
$processed_data = array();

if( ! $fh = fopen($myfile, 'r') ) { die("could not open $myfile."); }

while( $line = fgets($fh) ) {
  $processed_data[] = processing_function($line);
}
fclose($fh);
其中,
processing\u function()
只返回所需的准确数据,从而将内存使用率保持在最低限度


如果您发布的代码详细说明了您对这些数据的实际操作,人们可能会提出更好的方法。

如果您的主机不支持,那么您就有问题了。most宿主容器使用最大内存。您无法从您的侧面将其设置得更高。您可能无法覆盖此设置。。。您的主机可能在
安全模式下使用php。这个文件是什么?你需要它做什么?也许可以像米雷隆所展示的那样分块阅读……uffss。。感谢@Adrian的快速回复。。但如果是这样的话,那对我来说将是一个真正的问题。有什么办法可以解决这个问题吗?是的,你有两种方法可以解决这个问题:联系你的主机提供商,向他寻求解决方案(可能会增加你的内存),或者找一个你有更多自由的主机提供商。@santoshkumbhoje你在使用什么主机?我不是
-1
,是其他人,但我会尽力解释。。。给定的示例无法解决此问题,因为
$data
仍将变为与通过
文件\u get\u contents()
加载的大小相同。这是事实,但如果所有处理都可以在while循环中完成。。。(我编辑了答案)是的,这就是为什么我在对主要问题的评论中对你的解决方案给出了反馈。你可以试着直接利用记忆。但是我不认为它能解决问题。是的,我需要完整的数据,顺便说一句,谢谢你的回复,代码请看我编辑的和平@santoshkumbhoje你确定吗?因为它看起来像是在构造时加载到内存中一次,然后在一个函数中通过
foreach
进行迭代。我想说,在构建时使用
is\u readable()
检查文件的存在性和可读性,然后打开它并在
detectOnSubImage()
函数中循环。
$myfile = '/path/to/file.dat';
$processed_data = array();

if( ! $fh = fopen($myfile, 'r') ) { die("could not open $myfile."); }

while( $line = fgets($fh) ) {
  $processed_data[] = processing_function($line);
}
fclose($fh);