質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

11597閲覧

PHPでファイル書き込み後にメモリが解放されない(PHPの問題ではない

popup

総合スコア24

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/03/16 07:54

編集2015/03/18 03:21

原因または解決策をご存知の方がいらっしゃいましたら教えて下さい。

topコマンドでメモリ使用量を追いながら以下のスクリプトを実行すると、
実行終了後もa.pdfのファイルサイズと同じ分だけメモリが解放されません。
ファイルサイズは150MBほどです。

lang

1<?php 2$input_path = '/tmp/a.pdf'; 3$output = fopen('/tmp/b.pdf', 'wb'); 4fwrite($output, file_get_contents($input_path)); 5fclose($output); 6

その後以下を実行するとメモリ使用量は元に戻ります。

lang

1rm /tmp/b.pdf

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

topコマンドでメモリ使用量を追いながら以下のスクリプトを実行すると、
実行終了後もa.pdfのファイルサイズと同じ分だけメモリが解放されません。
ファイルサイズは150MBほどです。

top の何を見ていますか? 恐らくそれはディスクキャッシュによるものです。

プログラムが終了してもカーネルが b.pdf をメモリにキャッシュしているため、見せかけのメモリ使用量は減りません。

Linux の free コマンドの -/+ buffers/cache の行を見れば、ディスクキャッシュを除いた実際の使用量が確認できます。

投稿2015/03/16 09:03

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popup

2015/03/18 03:11

ありがとうございます、大変勉強になりました。 ディスクキャッシュの存在をしらず、 memoryのfreeのところだけを見ていました。 watch -n 1 free で継続的に観測したところ、free, buffers, cachedの合計は減少していませんでした。
guest

0

/tmp がメモリの上にramdiskのような形で作られているのでそれでその分のメモリが消費されているということでしょうか。
出力するファイル名を /home/user1/1.pdf とかに変更してみてはどうでしょう?

投稿2015/03/17 10:51

yoshidatakeshi0

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popup

2015/03/18 03:20

ありがとうございます。 /tmp以外のディレクトリに出力した場合には、このような現象はおきませんでした。 /tmpは他と違って”揮発性”をもったディレクトリなんですね。
guest

0

よくわからないんですが、
file_get_contentsは一旦変数に保存するそうで、それが保持されているっぽいですね。

fwrite($output, file_get_contents($input_path));

$pdf = file_get_contents($input_path);
fwrite($output, $pdf);
unset($pdf);

としたら、リークしないんじゃないでしょうか? 予想ですが…

投稿2015/03/16 08:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popup

2015/03/16 08:58

回答ありがとうございます。 継続して調べていたところ、 cp /tmp/a.pdf /tmp/b.pdf でもメモリは解放されないままでした。 そこで、os側の機能だと思い調べたところこのようなドキュメントを見つけました。 http://www.ibiblio.org/pub/Linux/docs/fsstnd/old/fsstnd-1.2.txt 3.11 が/tmpディレクトリに関する章で、 > /tmp may be on a RAM disk. /var/tmp should never be located on a RAM device. だそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問