Scala酸洗:我自己的班级简单的自定义pickler?

时间:2013-12-30 02:39:50

标签: scala serialization avro kryo scala-pickling

我正在尝试在我的Scala NLP(自然语言处理)应用程序中挑选一些相对简单的结构但是大而慢的创建类。因为有很多数据,所以需要pickle和esp。快速,无臃肿。 Java序列化显然在这方面很糟糕。我知道Kryo,但我从未使用它。我也遇到了Apache Avro,虽然我不太清楚为什么它通常不被认为是一个合适的解决方案。两者都不是特定于Scala的,我看到有一个名为Scala Pickling的Scala特定包。不幸的是,它缺少几乎所有文档,我不知道如何创建自定义pickler。

我在这里看到一个问题:

Scala Pickling: Writing a custom pickler / unpickler for nested structures

在这个问题上仍然存在一些背景,而且与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
) { ... }

我如何以尽可能少的样板文件的方式创建自定义选择器/ unpickler(因为我有许多其他需要类似处理的类)?

谢谢!

0 个答案:

没有答案