リストをマッピングしている間、各反復後にメモリが解放されますか?

ソルダルマ

これが初心者の質問なら申し訳ありませんが、私は確信する必要があります。

関数が呼び出されると、一時オブジェクトが作成される場合があり、そのオブジェクトのメモリ割り当ては終了時に解放されます。

私の質問は、関数がリストにマップされている場合、各関数呼び出しによって割り当てられたメモリはすぐに解放されますか、それともリスト全体が処理された後にのみ解放されますか?

これは例です。各関数呼び出し内に2つのオブジェクト(newListとnewRec)が作成されることを除いて、コードが具体的に行うことは意味がありません。

newListとnewRecに割り当てられたメモリは、各「反復」の後に解放されますか、それともList.mapの呼び出しが終了した後にのみすべてのメモリが解放されますか?

これはおそらく命令型言語のループで簡単に理解できるはずですが、F#コンパイラがそのような場合にどのように対処するかはわかりません。

type MyRecord = { AList: int list; Name: string }
let myRecord = { AList = [1..100]; Name = "SomeRecord" }
let foo (arec: MyRecord) i =
    let newList = arec.AList |> List.filter (fun x -> x >= i)
    let newRec = { arec with AList = newList }
    List.sum newRec.AList
let res = [1..100] |> List.map (foo myRecord)
Gilles'SO-悪であることをやめなさい '

どちらでもない。F#にはガベージコレクションに基づく自動メモリ管理がありますメモリのブロックが解放される原因は、構文上の条件ではなく、実行時の条件です。メモリのブロックは、到達不能になった後に解放されます。

現在のスコープ内の変数からオブジェクトを取得する方法がある場合、オブジェクトは到達可能です。関数のfoo実行中、newListおよびnewRec到達可能であるため、解放されません。関数が戻るとき、newListおよびnewRecもはや直接到達可能ですが、どのような彼らが解放可能になることは、彼らはもはやされていないことである間接的に到達可能なのいずれか。次のバリエーションを検討してくださいfoo

let bar (arec: MyRecord) i =
    let newList = arec.AList |> List.filter (fun x -> x >= i)
    let newRec = { arec with AList = newList }
    newRec.AList

bar戻ると、newRecオブジェクトは到達できなくなりますがnewList、関数によって返され、関数の呼び出し元が使用できるためオブジェクトは到達可能です。

自動メモリ管理は、オブジェクトの寿命を気にする必要がないことを意味します。特に、解放されたオブジェクトにアクセスしようとすることは不可能です¹。構造上、オブジェクトにアクセスできれば、到達可能であるため解放されません。

の特定のケースではfoo、への呼び出しがfoo戻るとすぐに、それが作成したオブジェクトnewRecnewListオブジェクトに到達できなくなります。これは、必ずしもすぐに解放されることを意味するわけではありません。遅くとも、次の完全なガベージコレクターの実行中に解放されます。到達不能なオブジェクトが解放されずに残る時間は、ガベージコレクターの品質の問題です。これは、メモリ使用量とパフォーマンスの間の妥協点です(GCを実行すると、収集されていないガベージがほとんど残らないが、CPU時間がかかります。GCを実行すると、CPU時間がほとんど消費されないが、収集されていないガベージがたくさん残ります)。

いずれにせよ、fooを介して複数回呼び出しているという事実List.mapは、メモリ管理とは関係ありません。List.map戻っても特別なことは何も起こりません

¹アンマネージメモリを使用する他の言語で記述されたコードと対話する場合を除き ます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Newman.runによりheapUsedが増加しますが、反復を繰り返している間はメモリを解放しません

分類Dev

スクリプトを期待する:sshを使用してリモートサーバーにログインするメソッドを作成し、メソッドが返された後にコマンドを送信します

分類Dev

Intel Optaneメモリをアンインストールしました-再起動後にコンピュータが起動しないというメッセージが表示されます(復元ポイントがあります-それは機能しますか?)

分類Dev

タイプTObjectListのリストが反復後に自動的に解放されるのはなぜですか?

分類Dev

xarrayまたはdaskは本当にメモリマッピングをサポートしていますか?

分類Dev

弱いハッシュマップは、参照が解除されるとすぐにメモリを解放しますか?

分類Dev

Inifinibandを使用してリモートメモリをホストのアドレス空間にマッピングする

分類Dev

メモリマッピングを使用してAndroidのプロセス間でメモリを共有する

分類Dev

スクリーンショットがforループの次の反復で上書きされているか、2回目の反復でスクリーンショットを取得していない可能性があります

分類Dev

c#リストは各反復後に消去されます

分類Dev

TBitmap変数を解放するときのアクセス違反-解放後もビットマップ変数が割り当てられていますか?

分類Dev

PresentViewControllerを使用すると、提示しているViewControllerがメモリから解放されますか?

分類Dev

リスト内の各値をAPIに渡し、リストの各リストの後で一時停止しながら、リストのリストを反復処理するにはどうすればよいですか?

分類Dev

SCNNodeを削除しても、新しいSCNNodeを作成する前にメモリが解放されません

分類Dev

Guava LoadingCacheのマップビューエントリセットを反復処理すると、有効期限に使用されるアクセス時間がリセットされますか?

分類Dev

通常はプログラムの最後に解放される長寿命のメモリを解放する必要がありますか?

分類Dev

メモリーフットプリントが少ない大きなXMLを反復解析し、ネストされたものも含めてすべてのシーケンス要素を取得します

分類Dev

各反復でリセットが必要かどうかをベンチマークするにはどうすればよいですか?

分類Dev

私はメモリとスワッピングを使い果たし続けていますが、何がそれほど多くのRAMを使用しているかを理解するのに苦労しています

分類Dev

StringValueCStrを使用した後、メモリは解放されますか?

分類Dev

リストのディクショナリを反復処理し、各反復をすべてのキーのアイテムとペアリングするにはどうすればよいですか?

分類Dev

ギガバイトの空きメモリがある場合、上部には「swout」(スワッピング)が表示されます。どうして?

分類Dev

Paramikoを使用してリモートサーバーでコマンドからの応答が起動されない場合は、一定時間後にリモートセッションを強制終了します

分類Dev

リクエストを使用して常にsubredditのトップ投稿をスクレイピングすると、間違った結果が返されます

分類Dev

Malloc-解放後にメモリを使用するためにエラーがトリガーされない

分類Dev

LinuxでC ++プログラムを実行していますが、クラッシュ後の回復のために定期的に状態スナップショットを共有メモリに保存することは可能ですか?

分類Dev

スタックメモリが解放されていません

分類Dev

Reduxストアに保存されているJSONオブジェクトをマッピングしますか?

分類Dev

出力がリスト要素の間にあるように、各反復で重複して出力します

Related 関連記事

  1. 1

    Newman.runによりheapUsedが増加しますが、反復を繰り返している間はメモリを解放しません

  2. 2

    スクリプトを期待する:sshを使用してリモートサーバーにログインするメソッドを作成し、メソッドが返された後にコマンドを送信します

  3. 3

    Intel Optaneメモリをアンインストールしました-再起動後にコンピュータが起動しないというメッセージが表示されます(復元ポイントがあります-それは機能しますか?)

  4. 4

    タイプTObjectListのリストが反復後に自動的に解放されるのはなぜですか?

  5. 5

    xarrayまたはdaskは本当にメモリマッピングをサポートしていますか?

  6. 6

    弱いハッシュマップは、参照が解除されるとすぐにメモリを解放しますか?

  7. 7

    Inifinibandを使用してリモートメモリをホストのアドレス空間にマッピングする

  8. 8

    メモリマッピングを使用してAndroidのプロセス間でメモリを共有する

  9. 9

    スクリーンショットがforループの次の反復で上書きされているか、2回目の反復でスクリーンショットを取得していない可能性があります

  10. 10

    c#リストは各反復後に消去されます

  11. 11

    TBitmap変数を解放するときのアクセス違反-解放後もビットマップ変数が割り当てられていますか?

  12. 12

    PresentViewControllerを使用すると、提示しているViewControllerがメモリから解放されますか?

  13. 13

    リスト内の各値をAPIに渡し、リストの各リストの後で一時停止しながら、リストのリストを反復処理するにはどうすればよいですか?

  14. 14

    SCNNodeを削除しても、新しいSCNNodeを作成する前にメモリが解放されません

  15. 15

    Guava LoadingCacheのマップビューエントリセットを反復処理すると、有効期限に使用されるアクセス時間がリセットされますか?

  16. 16

    通常はプログラムの最後に解放される長寿命のメモリを解放する必要がありますか?

  17. 17

    メモリーフットプリントが少ない大きなXMLを反復解析し、ネストされたものも含めてすべてのシーケンス要素を取得します

  18. 18

    各反復でリセットが必要かどうかをベンチマークするにはどうすればよいですか?

  19. 19

    私はメモリとスワッピングを使い果たし続けていますが、何がそれほど多くのRAMを使用しているかを理解するのに苦労しています

  20. 20

    StringValueCStrを使用した後、メモリは解放されますか?

  21. 21

    リストのディクショナリを反復処理し、各反復をすべてのキーのアイテムとペアリングするにはどうすればよいですか?

  22. 22

    ギガバイトの空きメモリがある場合、上部には「swout」(スワッピング)が表示されます。どうして?

  23. 23

    Paramikoを使用してリモートサーバーでコマンドからの応答が起動されない場合は、一定時間後にリモートセッションを強制終了します

  24. 24

    リクエストを使用して常にsubredditのトップ投稿をスクレイピングすると、間違った結果が返されます

  25. 25

    Malloc-解放後にメモリを使用するためにエラーがトリガーされない

  26. 26

    LinuxでC ++プログラムを実行していますが、クラッシュ後の回復のために定期的に状態スナップショットを共有メモリに保存することは可能ですか?

  27. 27

    スタックメモリが解放されていません

  28. 28

    Reduxストアに保存されているJSONオブジェクトをマッピングしますか?

  29. 29

    出力がリスト要素の間にあるように、各反復で重複して出力します

ホットタグ

アーカイブ