PHP 写一个大文件 - 缓存的 RAM
Posted
技术标签:
【中文标题】PHP 写一个大文件 - 缓存的 RAM【英文标题】:PHP Write a Big File - cached RAM 【发布时间】:2016-04-25 16:37:51 【问题描述】:我遇到了一个让我发疯的问题,我不明白为什么会这样。
我的系统是带有 16GB 内存的 Ubuntu 14.04。
我有一个包含以下代码的 php 脚本
<?php
$fp = fopen( "http://...", 'r' );
$write_pointer = fopen( 'test.bin', 'a' );
while ( !feof( $fp ) )
fwrite( $write_pointer, stream_get_line( $fp, 4096 ) );
fflush( $write_pointer );
fclose( $write_pointer );
fclose( $fp );
?>
它从 HTTP(无限)读取并写入文件。这个文件可以是一个非常大的文件,因为它是无穷无尽的,所以高达 40 GB。
我正在将文件 (test.bin
) 写入磁盘,而不是 RAM 磁盘或其他东西。
问题在于CACHED RAM is being increased all the time
,1-2 天后它只在缓存中 100%。
有人可以向我解释为什么会这样吗?为什么要消耗这么多内存?
即使我清除缓冲区,1-2 天后也会发生同样的事情
谢谢 问候
【问题讨论】:
通常您会希望在 PC 上看到较高的“缓存 ram”使用率 - 这将有助于防止损坏磁盘,这可能会对性能造成重大影响。 所以系统知道我要在磁盘上写很多数据,并使用ram来防止这种情况发生?如果我想禁用它? 我认为@MarcB 是对的。如果您不熟悉 Linux 如何使用 RAM,请查看此站点 linuxatemyram.com 未使用的内存是浪费的内存,因此操作系统会将未使用的内存用作磁盘缓存。如果应用程序需要更多“实际”内存来存储数据/代码,则磁盘缓存将自动缩小以适应这一点。从技术上讲,在现代操作系统上,基本上不应该有任何“未使用”的内存。 【参考方案1】:您可以通过跟踪您的 $write_pointer
已打开的持续时间以及在特定时间段后关闭/重新打开来绕过此问题。
【讨论】:
【参考方案2】:由于 Linux 内核将文件缓存到 RAM 的特性。在健康的 Linux 系统中,空闲内存总是接近 0,而缓存接近未使用的内存。 您可以使用此命令定期清除缓存:
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
请注意,尽管很多源状态缓存内存在进程回收时会立即释放,但在某些情况下,当内存被大量使用时,缓存内存可能会导致内存不足崩溃,这不是 Linux 错误,而是更多一个糟糕的设计。如果您的交换未被使用,那么您不必担心可用内存。 不要将缓冲区与缓存混淆。写入时使用缓冲区,读取时使用缓存。
【讨论】:
以上是关于PHP 写一个大文件 - 缓存的 RAM的主要内容,如果未能解决你的问题,请参考以下文章