PHP写一个大文件 - 缓存的RAM

时间:2016-04-25 16:37:51

标签: php linux

我遇到的问题让我发疯,我无法理解为什么会这样。

我的系统是Ubuntu 14.04,带有16GB Ram。

我有一个包含以下代码的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-Disk或其他内容。

问题在于CACHED RAM is being increased all the time,并且在1-2天之后它仅在CACHED中达到100%。

有人可以向我解释为什么会这样吗?为什么消耗这么多内存?

即使我清除缓冲区,1-2天之后也会发生同样的事情

谢谢 此致

2 个答案:

答案 0 :(得分:0)

您可以通过跟踪$write_pointer已打开的时间段以及在特定时间段后关闭/重新打开的时间段来绕过此问题。

答案 1 :(得分:0)

由于Linux内核将文件缓存到RAM中的性质。在健康的Linux系统中,空闲内存总是接近0,并且高速缓存靠近未使用的内存。 您可以使用以下命令定期清除缓存:

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

注意尽管有很多源,但是当进程回收它时会立即释放状态缓存内存,在某些情况下,当内存占用较多时,缓存内存可能会导致内存崩溃,而且它不是Linux错误,它更糟糕的设计。如果没有使用你的交换,那么你不必担心空闲内存。 不要将缓冲区与缓存混淆。在写作时使用缓冲区,缓存用于阅读。