【问题标题】:How do I make PHP *actually* release allocated RAM?如何让 PHP *实际* 释放分配的 RAM?
【发布时间】:2021-02-11 11:40:49
【问题描述】:

我最近一直在测试与记忆相关的东西。仔细阅读:

$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_get_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_huge_file 函数基本上运行 fopen blabla 后跟 fclose。)

我该怎么办?似乎 PHP 仍然“使用”内存,而我的重型 PHP CLI 脚本最终在处理许多 CSV 文件时耗尽了我所有的内存,并且内存没有被返回。

我想我根本不明白gc_collect_cycles() 做了什么。该手册至少可以说不清楚。

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

(关于计算机的一切永远都让我感到困惑。没有任何东西可以真正学到,除非每个细节都有无穷无尽的额外复杂层。)

【问题讨论】:

  • PHP 不分配 RAM。它分配内存,操作系统的工作是确定该内存的哪些部分占用 RAM,哪些不占用。也就是说,PHP 有一个不确定的垃圾收集器,它会随着内存压力的增加而运行。除非你有真正的问题,否则你不需要做任何事情。

标签: php windows memory-management command-line-interface ram


【解决方案1】:

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

最好在https://www.php.net/manual/en/function.fgetcsv.php的帮助下使用循环

仅将 1 行加载到内存中,而不是整个文件。

【讨论】:

  • 虽然我知道 fgetcsv() 的存在,但我已经告诉自己这是一场破碎的噩梦,我应该“永远不要再尝试使用它”。我确信我写这个是有充分理由的,而且我隐约记得它有多大的问题......但除此之外,我的一般问题仍然存在。
  • PHP 不是一个桌面应用程序,无论出于何种原因,它都会加载大量数据内存。使用 fgetcsv 处理数据是一种有效的方法,许多开发人员都在使用它。出于这个原因创建它是为了最大限度地减少内存使用的滥用。
  • 您从哪里得到只有“桌面应用程序”才能加载大量数据的荒谬想法?恰恰相反,我会说。
  • 其实我还是用了fgetcsv。所以即使使用这种方法也会出现问题。但同样,这只是一个例子。基本问题与 fgetcsv() 或 CSV 文件无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2011-08-23
  • 1970-01-01
  • 2020-10-07
  • 2021-10-04
相关资源
最近更新 更多