Skip to content
Snippets Groups Projects
Commit 7febdfbe authored by Matei Zaharia's avatar Matei Zaharia
Browse files

Better reuse of buffers in Kryo serialization

parent 7408230b
No related branches found
No related tags found
No related merge requests found
...@@ -58,10 +58,8 @@ object ZigZag { ...@@ -58,10 +58,8 @@ object ZigZag {
} }
} }
class KryoSerializationStream(kryo: Kryo, out: OutputStream) class KryoSerializationStream(kryo: Kryo, buf: ByteBuffer, out: OutputStream)
extends SerializationStream { extends SerializationStream {
val buf = ByteBuffer.allocateDirect(1024*1024)
def writeObject[T](t: T) { def writeObject[T](t: T) {
kryo.writeClassAndObject(buf, t) kryo.writeClassAndObject(buf, t)
ZigZag.writeInt(buf.position(), out) ZigZag.writeInt(buf.position(), out)
...@@ -74,10 +72,8 @@ extends SerializationStream { ...@@ -74,10 +72,8 @@ extends SerializationStream {
def close() { out.close() } def close() { out.close() }
} }
class KryoDeserializationStream(kryo: Kryo, in: InputStream) class KryoDeserializationStream(buf: ObjectBuffer, in: InputStream)
extends DeserializationStream { extends DeserializationStream {
val buf = new ObjectBuffer(kryo, 1024*1024)
def readObject[T](): T = { def readObject[T](): T = {
val len = ZigZag.readInt(in) val len = ZigZag.readInt(in)
buf.readClassAndObject(in, len).asInstanceOf[T] buf.readClassAndObject(in, len).asInstanceOf[T]
...@@ -86,8 +82,8 @@ extends DeserializationStream { ...@@ -86,8 +82,8 @@ extends DeserializationStream {
def close() { in.close() } def close() { in.close() }
} }
class KryoSerializer(kryo: Kryo) extends Serializer { class KryoSerializer(strat: KryoSerialization) extends Serializer {
val buf = new ObjectBuffer(kryo, 1024*1024) val buf = strat.threadBuf.get()
def serialize[T](t: T): Array[Byte] = { def serialize[T](t: T): Array[Byte] = {
buf.writeClassAndObject(t) buf.writeClassAndObject(t)
...@@ -98,11 +94,11 @@ class KryoSerializer(kryo: Kryo) extends Serializer { ...@@ -98,11 +94,11 @@ class KryoSerializer(kryo: Kryo) extends Serializer {
} }
def outputStream(s: OutputStream): SerializationStream = { def outputStream(s: OutputStream): SerializationStream = {
new KryoSerializationStream(kryo, s) new KryoSerializationStream(strat.kryo, strat.threadByteBuf.get(), s)
} }
def inputStream(s: InputStream): DeserializationStream = { def inputStream(s: InputStream): DeserializationStream = {
new KryoDeserializationStream(kryo, s) new KryoDeserializationStream(buf, s)
} }
} }
...@@ -114,6 +110,14 @@ trait KryoRegistrator { ...@@ -114,6 +110,14 @@ trait KryoRegistrator {
class KryoSerialization extends SerializationStrategy with Logging { class KryoSerialization extends SerializationStrategy with Logging {
val kryo = createKryo() val kryo = createKryo()
val threadBuf = new ThreadLocal[ObjectBuffer] {
override def initialValue = new ObjectBuffer(kryo, 128*1024*1024)
}
val threadByteBuf = new ThreadLocal[ByteBuffer] {
override def initialValue = ByteBuffer.allocate(128*1024*1024)
}
def createKryo(): Kryo = { def createKryo(): Kryo = {
val kryo = new Kryo() val kryo = new Kryo()
...@@ -158,5 +162,5 @@ class KryoSerialization extends SerializationStrategy with Logging { ...@@ -158,5 +162,5 @@ class KryoSerialization extends SerializationStrategy with Logging {
kryo kryo
} }
def newSerializer(): Serializer = new KryoSerializer(kryo) def newSerializer(): Serializer = new KryoSerializer(this)
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment