Я широко использую хронику в Scala и недавно решил экспериментировать с сериализацией Kryo. Я добавил пользовательские маршаллеры (код ниже), и хотя он уменьшил размер моих магазинов на 14G (примерно 62%), и все еще работает, скорость была неприемлемой.Сериализация Крио в хронике Карта - медленное чтение байта
Я создал образец USECASE и сделал несколько спусков на один и те же данные
[Using kryo] took 6883, and then 7187, 6954, 7225, 13051
[Not using kryo] took 2326, and then 1352, 1493, 1500, 1187
Так что это в несколько раз медленнее. Вот маршаллер для чтения:
class KryoMarshallerReader[T] extends BytesReader[T] {
val kryo = // Reference to KryoPool from Twitter's Chill library
override def read(in: Bytes[_], using: T): T = {
val bytes = benchmark("array allocation") {
new Array[Byte](in.readRemaining().toInt)
}
benchmark("reading bytes") {
in.read(bytes)
}
benchmark("deserialising") {
kryo.fromBytes(bytes).asInstanceOf[T]
}
}
override def readMarshallable(wire: WireIn): Unit = {}
override def writeMarshallable(wire: WireOut): Unit = {}
}
Я усреднены время выполнения (все в мс) по сравнению с теми три этапа и понял, что чтение байт является самым медленным:
stage Average time (ms)
(fctr) (dbl)
1 [array allocation] 0.9432907
2 [deserialising] 0.9944112
3 [reading bytes] 13.2367265
Теперь вопрос - что я делаю неправильно?
Я просмотрел интерфейс Bytes[_]
и, похоже, он читает байты один за другим - есть ли способ использовать буфер или что-то магически способное к массовой загрузке?
Update: В конце концов я изменил распределение массива + чтение байт in.toByteArray
но он по-прежнему медленно, потому что под капотом у него копии байтов по одному. Просто работает читает на карте показывает, что чтение байт узкого места: