私は、基本的にデータを収集し、いくつかのテーブルを計算するプログラムを完成させました(私は最終的にサマリーテーブルを計算するために、一般的にフィルタや集計レベル(Clojure関数のようなSELECT + GROUP BYを書いた)です)。後で使用し、唯一の30 000行の長であるClojure:オブジェクトをメモリから削除するにはどうしたらいいですか?
あなたが理解させるために、これは私が起動する必要がありコマンドです:。
(def summary-pages (merge-summary-pages (merge-pages-stock (compute-stock) (compute-pages) (compute-xx-prices) (compute-g) (compute-brands) (compute-prices) (compute-sales) (compute-sales-month))
(merge-full-pages-per-page (merge-full-pages (merge-pages-stock (compute-stock) (compute-pages) (compute-xx-prices) (compute-g) (compute-brands) (compute-prices) (compute-sales) (compute-sales-month)) (merge-pages-stock-excluded (compute-pages) (compute-stock) (compute-g) (compute-brands) (compute-prices) (compute-sales) (compute-sales-month))))
(merge-pages-stock-per-page (merge-pages-stock (compute-stock) (compute-pages) (compute-xx-prices) (compute-g) (compute-brands) (compute-prices) (compute-sales) (compute-sales-month)))
(merge-affectations-count (compute-affectations))))
あなたが見ることができるように、私はいくつかの時間(とで同じデータを呼び出します事実(compute-pages)
はcompute-affectations
を呼び出します。
これは動作しますが、問題はcompute-pages
、特にcompute-affectations
はGoogle BQ(15百万行)とMicrosoft SQL Server(45百万行)で非常に巨大なクエリです。
問題は、それらを4〜5回クエリするのに時間がかかることです。また、データベースを破壊することも恐れています。
もう1つの問題は、すべてcompute-affectations
を計算する必要があるということです。これはSQL Serverと私の左結合の使用によるものですからです。
私はdef
でジョブを分割しようとしましたが、GCオーバーヘッドエラーがあります。私はいくつかの計算の後affectations
をきれいにすることができます ので、私はマイクロソフトコマンドパネルのメモリが自由に表示されていない、何も変更はありません...
(def affectations nil)
を試してみました。
メモリをクリーンアップする方法はありますか?
私のプログラムはまったく問題なく動作します(実際にはメモリ使用量は最大で80%ですが)ここでは13GBのヒープ領域があります。 私は16GBのRAMを持っていますので、ヒープスペースを増やすことはできません。さらに、このような「小さい」データには非常に多くのメモリが必要なことは奇妙なことです。
Iは、CSVでテストデータを計算し、基本データは、コード(その一部)の操作のみ3.3ギガバイト...
EDIT
である:私は書き込み
(let [_ (init-config! path)
_ (write-affectations)
_ (write-pages)
_ (spit "prepared-pages.edn" (prn-str (prepare-pages (read-pages))) :append :true)
_ (write-stock)
_ (write-prices)
_ (write-xx-prices)
_ (write-brands)
_ (write-g)
_ (write-vehicles)
_ (write-sales)
_ (write-sales-month)
_ (System/gc)
stock (read-stock)
affectations (read-affectations)
pages (read-pages)
prepared-pages (prepare-pages pages)
xx-prices (read-xx-prices)
g (read-g)
brands (read-brands)
prices (read-prices)
sales (read-sales)
sales-month (read-sales-month)
pages-stock (merge-pages-stock stock prepared-pages xx-prices g brands prices sales sales-month)
pages-stock-excluded (merge-pages-stock-excluded prepared-pages stock g brands prices sales sales-month)
full-pages-per-page (-> (merge-full-pages pages-stock pages-stock-excluded)
(merge-full-pages-per-page))
pages-stock-per-page (merge-pages-stock-per-page pages-stock)
affectations-count (merge-affectations-count affectations)
summary-pages (doall (merge-summary-pages pages-stock full-pages-per-page pages-stock-per-page affectations-count))
_ (System/gc)
_ (io/delete-file "affectations.edn")
_ (io/delete-file "pages.edn")
_ (io/delete-file "prepared-pages.edn")
_ (io/delete-file "stock.edn")
_ (io/delete-file "prices.edn")
_ (io/delete-file "xx-prices.edn")
_ (io/delete-file "brands.edn")
_ (io/delete-file "g.edn")
_ (io/delete-file "vehicles.edn")
_ (io/delete-file "sales.edn")
_ (io/delete-file "sales-month.edn")
をHDD(.ednファイル)上のクエリの内容を調べ、それをゆっくりと読み、それを関数に渡します。
ありがとうございます!これらは、それがような状況をチェックするのは難しいん正確に何を知らず
'コンピュート・ページへのすべてのものを呼び出した場合:タイムコールがそのように私はそれが実際にかかった時間がわからないスローされた例外によってバイパスされたもののテストは最終的に、メモリ不足'または' compute-affectations'は毎回同じデータを返しています。なぜ 'let'を使わないのですか? –
こんにちは、ありがとう私もそれを試しましたが、私の主な部分にあるので、実際に私のすべてのデータは大きなレットにあります。実際に私が説明したコマンドでさえ、SQL ServerとBQでは動作しません。私は愚かな微調整を見つけましたが、うまくいきました。まず、これらの2つの特定のテーブルをクエリし、HDD(CSV)にチャンクですぐに書き込み、それを(compute-summary-pages)に渡します。私は専門のプログラマーではないので、何が起こっているのか、実際の手掛かりはありません。文字列データが多すぎるメモリ(BQ)を消費したり、SQLクエリが遅延していませんか? –
ところで、これは良いメモリプロファイラが解決に非常に役立つという問題のクラスです。あなたがOSSの仕事のために独占的にそれを使用していて、無料のライセンスを要求していない限り、お金がかかりますが、YourKitは優れた仕事をします。 –