2

私のScala NLP(自然言語処理)アプリで、比較的単純な構造であるが大きくて作成に時間がかかるいくつかのクラスをピクルしようとしています。大量のデータがあるため、ピクルと esp が必要です。膨張せずにすばやく解凍します。Java のシリアライゼーションは、この点で明らかに問題があります。Kryo については知っていますが、使用したことはありません。私は Apache Avro にも遭遇しましたが、これは似ているように見えますが、通常、適切なソリューションとして言及されていない理由はよくわかりません。どちらも Scala 固有ではなく、Scala Pickling と呼ばれる Scala 固有のパッケージがあるようです。残念ながら、ほとんどすべてのドキュメントが不足しており、カスタム ピッカーを作成する方法がわかりません。

ここに質問があります:

Scala Pickling: ネストされた構造のカスタム pickler / unpickler を書く

その質問にはまだいくつかのコンテキストが欠けています。また、Kryo や Avro の例と比較して、カスタム ピックラーを作成するには非常に多くのボイラープレートのように見えます。

シリアル化する必要があるクラスの一部を次に示します。

trait ToIntMemoizer[T] {
  protected val minimum_raw_index: Int = 1
  protected var next_raw_index: Int = minimum_raw_index

  // For replacing items with ints. This is a wrapper around
  // gnu.trove.map.TObjectIntMap to make it look like mutable.Map[T, Int].
  // It behaves the same way.
  protected val value_id_map = trovescala.ObjectIntMap[T]()

  // Map in the opposite direction. This is a wrapper around
  // gnu.trove.map.TIntObjectMap to make it look like mutable.Map[Int, T].
  // It behaves the same way.
  protected val id_value_map = trovescala.IntObjectMap[T]()

  ...
}

class FeatureMapper extends ToIntMemoizer[String] {
  val features_to_standardize = mutable.BitSet()
  ...
}

class LabelMapper extends ToIntMemoizer[String] {
}

case class FeatureLabelMapper(
  feature_mapper: FeatureMapper = new FeatureMapper,
  label_mapper: LabelMapper = new LabelMapper
)

class DoubleCompressedSparseFeatureVector(
  var keys: Array[Int], var values: Array[Double],
  val mappers: FeatureLabelMapper
) { ... }

できるだけボイラープレートを使用しない方法でカスタムピッカー/アンピッカーを作成するにはどうすればよいですか (同様の処理が必要な他のクラスが多数あるため)。

ありがとう!

4

0 に答える 0