Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使PHP*实际上*释放分配的RAM?_Php_Windows_Memory Management_Command Line Interface_Ram - Fatal编程技术网

如何使PHP*实际上*释放分配的RAM?

如何使PHP*实际上*释放分配的RAM?,php,windows,memory-management,command-line-interface,ram,Php,Windows,Memory Management,Command Line Interface,Ram,我最近一直在测试与记忆有关的东西。仔细阅读以下内容: $data = load_in_huge_file('test.csv'); while (1) { var_dump(memory_get_usage(false)); var_dump(memory_get_usage(true)); sleep(4); unset($data); } 对于第一个循环,第一次调用memory\u get\u usage和第二次调用都会输出一个巨大的值 对于第二个(以及更

我最近一直在测试与记忆有关的东西。仔细阅读以下内容:

$data = load_in_huge_file('test.csv');

while (1)
{
    var_dump(memory_get_usage(false));
    var_dump(memory_get_usage(true));
    sleep(4);
    unset($data);
}
对于第一个循环,第一次调用memory\u get\u usage和第二次调用都会输出一个巨大的值

对于第二个(以及更进一步的)循环,第一次调用memory_get_usage会输出一个小值,第二次调用会输出一个大值

这意味着实际的“分配”内存保持不变,即使我取消设置保存所有数据的变量

如果我这样做,同样的事情也会发生:

$data = load_in_huge_file('test.csv');

while (1)
{
    var_dump(memory_get_usage(false));
    var_dump(memory_get_usage(true));
    sleep(4);
    unset($data);
    gc_collect_cycles();
}
分配的“真实”内存在分配后保持不变,不会“释放”

(load_in_hug_file函数基本上运行fopen blabla,然后运行fclose。)

我该怎么办?似乎PHP仍然“使用”RAM,我的重载PHP CLI脚本最终会耗尽我所有的RAM,同时一个接一个地处理许多CSV文件,并且不会返回内存

我想我根本不明白
gc\u collect\u cycles()
做什么。该手册至少可以说不清楚

也许unset()就足够了,但它“需要一些时间”?也许“实际”分配的内存只是混淆了术语,实际上并不意味着RAM被“占用”


(关于计算机的一切永远让我困惑。没有什么东西是真正可以学习的,因为每一个细节都有无尽的额外复杂性。)

在我们的编程经验中,我们不建议将整个数据保存到一个变量(到内存中)

最好在以下帮助下使用loop:


一个内存中只加载一行,而不是整个文件。

虽然我知道fgetcsv()的存在,但我对自己说,这是一场破碎的噩梦,我不应该“再也不要尝试使用它”。我相信我写这篇文章有很好的理由,我隐约记得它有多大问题。。。但除此之外,我的一般问题仍然存在。PHP不是出于任何原因加载大量数据内存的桌面应用程序。使用fgetcsv处理数据是一种有效的方法,许多开发人员都在使用这种方法。它的创建就是为了最大限度地减少内存使用的滥用。你从哪里得到只有“桌面应用程序”才能加载大量数据的荒谬想法?我会说,恰恰相反。事实上,我确实使用了
fgetcsv
。因此,即使使用这种方法,问题也会发生。不过,这只是一个例子。基本问题与fgetcsv()或CSV文件无关。PHP不分配RAM。它分配内存,操作系统的任务是确定内存的哪些部分占用RAM,哪些部分不占用RAM。也就是说,PHP有一个非确定性的垃圾收集器,随着内存压力的增加而运行。除非你有真正的问题,否则你什么都不需要做。