プロセスがRAMにロードしたファイルを開きましたか?

プロセスがRAMにロードしたファイルを開きましたか?

注文するたとえばsed、プログラムはファイル内にコーディングされたロジックで構成されたプログラムであり、そのファイルはハードドライブのどこかにあります。ただし、コマンドを実行すると、次から始まります。ハードディスク投入されるメモリそこで彼らは復活して仕事をすることができ、呼びかけられました。プロセス

プロセスは他のファイルを使用して読み書きすることができます。そうする場合、これらのファイルは開かれたファイルと呼ばれます。実行中のすべてのプロセスで開かれたすべてのファイルを一覧表示するコマンドがありますlsof

いいですね。私が疑問に思うのは、コマンドのデュアルライフ(1つはハードドライブにあり、もう1つはRAMにあります)がロジックがプログラムされていないが、コンテナだけのファイルなどの他の種類のファイルでも機能するかどうかです。データ。

私の前提は、プロセスで開かれたファイルもRAMにロードされるということです。これが本当かどうかはわかりません。ただ直感だけです。

誰でもこれを理解できますか?

ベストアンサー1

いいえ、ファイルを開いてもファイルは自動的にメモリに読み込まれません。それは非常に非効率的です。sedたとえば、他の多くのUnixツールと同様に、入力は1行ずつ読み込まれます。現在の行よりも多くの行をメモリに保持する必要はほとんどありません。

そのままawkです。それを読む記録一度はデフォルト値が1行です。もちろん、入力データの一部が変数に保存されている場合は、追加1になります。

一部の人々はこのような習慣を持っています。

for line in $(cat file); do ...; done

$(cat file)シェルはループの最初の反復を実行する前にコマンド置換を完全に拡張する必要があるためfor〜する内容全体をfileメモリに読み込みます(ループを実行しているシェルが使用するメモリに読み込みますfor)。これは少し愚かでエレガントではありません。代わりにやるべきことは

while IFS= read -r line; do ...; done <file

この内容は1行ずつ処理されますfile「IFS=read-r-line」を理解する)。

ただし、ほとんどのユーティリティはライン指向であるため、シェルでファイルを1行ずつ処理する必要はほとんどありません(参照:シェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?)。

私は生物情報学の分野で働いていますが、大量のゲノムデータを扱うとき、必ずしも必要なデータビットだけをメモリに保存しないと、多くのことはできません。たとえば、VCFファイルにDNAバリアントを含む1TBデータセットから個人を識別するために使用できるデータビットを削除する必要がある場合(その種類のデータは公に利用できないため)、1行ずつ削除します。単純なawkプログラムを使用します(VCF形式がライン中心であるため可能です)。私欲しくないファイルをメモリに読み込んで、そこで処理して書き直してください!ファイルが圧縮されている場合は、それを介してzcat提供またはデータをストリーミングするgzip -d -cため、gzipファイル全体がメモリに読み込まれません。

ファイル形式にもかかわらずいいえJSONやXMLなどのラインベースには、大容量ファイルをすべてRAMに保存せずに処理できるストリーミングパーサーがあります。

実行可能ファイルの場合は、共有ライブラリを要求時にロードしたり、プロセス間で共有したりできるため、状況は少し複雑になります(参照:共有ライブラリのロードとRAM使用量、例えば)。

キャッシュはここで言及していません。これは、頻繁にアクセスされるデータブロックを保持するためにRAMを使用することです。実行可能ファイルなどの小さなファイルは、ユーザーが複数回参照できることを望むようにオペレーティングシステムによってキャッシュされる可能性があります。最初にファイルを読み取るときを除いて、後続のアクセスはディスクではなくRAMに行われます。キャッシュ(入力と出力のバッファリングなど)は通常ユーザーにとってほとんど透過的であり、コンテンツをキャッシュするために使用されるメモリの量は、たとえばアプリケーションによって割り当てられたRAMの量に応じて動的に変更できます。


1 技術的に、ほとんどのプログラムは明示的なバッファリングを使用するか、標準I / Oライブラリによって実行されたバッファリングを介して暗黙的に入力データを一度に1ブロックずつ読み込み、そのブロックをユーザーコードに1行ずつ表示することができます。あります。ディスクブロックサイズの倍数を読み取る方が、一度に1文字を読み取るよりもはるかに効率的です。ただし、このブロックサイズは数キロバイトを超えることはほとんどありません。

おすすめ記事