我正在尝试在我的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(因为我有许多其他需要类似处理的类)?
谢谢!