2017-03-08 15 views
-2

C/C++からGoにいくつかのコードを移植しました。これはマイクロサービスです。これは、C/C++よりも高速に動作します。しかし、私は記憶に問題があります。よりコンパクトな方法で5 GBのRAMを割り当てます。

私のプログラムが起動すると、約4.5GBのRAMが割り当てられ、読み込み中にデータを処理するディスクのデータが書き込まれます。その後、RAMからの要求を処理する数日(うまくいけば数ヶ月)実行されます。残念なことに、RAMへのデータの処理と配置が完了した後、3.5 GBのRAMがGoによって割り当てられたままになります。割り振りはしません。割り振りはしません。自分のプログラムが実際に8 GBを使用しているとは思わないので、Goはすぐに余分なRAMを獲得すると思います。

Goは未使用のRAMの割り当てを解除してシステムに返す機能を許可していないと読んでいます。できるだけ多くのRAMを節約して、同じマシンでより多くのサービスを実行したいので、実際に使用しているものとほとんど同じくらい無駄に感じます。

どのように空の3.5 GBがGoによって割り当てられるのを避けて、メモリフットプリントをコンパクトに保つ​​には?

+0

関連の質問を参照してください:[Golang - 一度bytes.Bufferによって占められて空きができないメモリ](http://stackoverflow.com/questions/37382600/golang-cannot-free-memory-once-occupied- by-bytes-buffer/37383604#37383604)。 、[FreeOSMemory()in production](http://stackoverflow.com/questions/42345060/freeosmemory-in-production/42345554#42345554)を参照してください。 – icza

+0

メモリが使用されていないこと、または仮想メモリのサイズだけでなく実際に割り当てられていることをどのように知っていますか? gctraceの出力はどのように見えますか?割り当てられたものを示す実際のmemstatsは何ですか? – JimB

+0

"4.5GBのRAMを使用し、ディスクからデータを処理してデータを処理する際に、読み込み中にフラットな[4.5e6]バイトを割り当てるだけでなく、データ構造がより複雑であるというヒントを与えます。あなたが与えた少数の情報であなたのアプリケーションのメモリフットプリントを減らすためにできることを示唆することは、文字通り不可能です。 – Volker

答えて

関連する問題