0

そのため、メモリ効率と高速性の両方が必要なコードを作成中です。私はすでにJavaで作業参照を持っていますが、それをkotlinで書き直していました。

基本的に、多くのcsvファイルをロードして一度ツリーにロードし、ロードしたら繰り返しトラバースする必要があります。

私はもともとシーケンスを使用してすべてを書きましたが、GC が繰り返しスパイクする原因になることがわかりました。

このコードを実際に共有することはできませんが、これが発生する原因を知っているかどうか疑問に思っていました.

必要に応じて詳細を追加しますが、これが私の基本的なパターンです。

ステップ1:inputStream -> csvLines: List<String>

ステップ2:csvLines.drop(x).fold(emptySequence()) -> callOtherFunctionWithFold -> callOtherFunctionWithFold -> Sequence<OutputObjects>

必要なルールに基づいて特定の行にアクセスしているため、csvLines を別のリストとして保持します。

ステップ3:Sequence<OuputObjects> -> nodes

結果は機能しますが、このコードは、配列リストを使用してその場で変更するだけの同等の Java よりもメモリ効率とパフォーマンスが大幅に低下します。

visualvm の出力を確認した後、大量の kotlin.*.ArrayIterator を作成しました。ラムダを使用するたびに作成するようです。

では、これをより効率的にするにはどうすればよいでしょうか。シーケンスはオブジェクトの作成を怠惰に減らすことになっていましたが、そうする能力を壊すようなことをしているようです。

シーケンスは GC の実行後に再評価されますか、または一般的に実行されますか? もしそうなら、起動時にロードされるオブジェクトで使用するのは不適切ですよね?

ビジュアル VM 実行

4

1 に答える 1

3

Kotlin シーケンスを使用するには、以下から始める必要があります。asSequence()

csvLines.asSequence()
    .drop(x)
    .fold(...)
    ...

それを省略すると、代わりに Collection 関数が使用され、すべての関数の後に新しい (中間) コレクションが作成されます。

于 2019-10-09T23:43:48.227 に答える