私は algo-class.org コースに従っており、そのプログラミング割り当ての 1 つで、次のような形式のファイルが提供されます。
1 2
1 5
2 535
...
このような行は 500 万以上あります。ファイルを読み込んで、[[1 2][1 5][2 535]...] のような整数ベクトルのベクトルに変換したいと考えています。
(defn to-int-vector [s]
(vec (map #(Integer/parseInt %) (re-seq #"\w+" s))))
(def ints (with-open [rdr (clojure.java.io/reader "<file>")]
(doall (map to-int-vector (line-seq rdr)))))
したがって、私はこのように信じています。ファイル全体をメモリに保持しておらず、大きな整数ベクトルのみを生成しています。しかし、これから OutOfMemoryError を取得します。rand-int を実行して、同じサイズと同じ形式のベクトルを生成しようとしましたが、うまくいきました。
生成された一時オブジェクトが原因でメモリの問題が発生しているように見えますか? このようなケースを処理するための clojure の理想的な方法は何ですか?
アップデート:
はい、整数ベクトル全体を保持していることに気付きました。ヒープサイズを上げたところ、動作するようになりました。ベクトルと 500 万の要素 (1000 万の整数) が非常に多くのメモリを占有する可能性があることに興味があります。jvm に 3g を割り当てる必要があります。メモリをダウンさせる他の方法はありますか?