Skip to content

Instantly share code, notes, and snippets.

@elucidator
Created April 7, 2016 14:41
Show Gist options
  • Save elucidator/646898054aad90cf5e01e1076c132ee9 to your computer and use it in GitHub Desktop.
Save elucidator/646898054aad90cf5e01e1076c132ee9 to your computer and use it in GitHub Desktop.
Gist for some marshalling and effect on the size of the resulting string
import java.io.ByteArrayOutputStream
import java.time.{Instant, ZonedDateTime}
import java.util.zip.GZIPOutputStream
import spray.json._
import scala.util.Random
case class SensorRecord(timestamp: ZonedDateTime, sensor1: Int, sensor2: Int, sensor3: Int, sensor4: Int, sensor5: Int, sensor6: Int, sensor7: Int, sensor8: Int, sensor9: Int, sensor10: Int, sensor11: Int)
case class DataRecord(exerciseId: String, gloveId: String, data: List[SensorRecord])
object SensorDataProtocol extends DefaultJsonProtocol {
implicit object SensorRecordJsonFormat extends RootJsonFormat[SensorRecord] {
def write(r: SensorRecord) =
JsArray(JsNumber(r.timestamp.toInstant.toEpochMilli), JsNumber(r.sensor1), JsNumber(r.sensor2), JsNumber(r.sensor3), JsNumber(r.sensor4), JsNumber(r.sensor5), JsNumber(r.sensor6), JsNumber(r.sensor7), JsNumber(r.sensor8), JsNumber(r.sensor9), JsNumber(r.sensor10), JsNumber(r.sensor11))
def read(value: JsValue) = value match {
case JsArray(Vector(JsNumber(timestamp), JsNumber(sensor1), JsNumber(sensor2), JsNumber(sensor3), JsNumber(sensor4), JsNumber(sensor5), JsNumber(sensor6), JsNumber(sensor7), JsNumber(sensor8), JsNumber(sensor9), JsNumber(sensor10), JsNumber(sensor11))) =>
new SensorRecord(ZonedDateTime.from(Instant.ofEpochMilli(timestamp.toLong)), sensor1.toInt, sensor2.toInt, sensor3.toInt, sensor4.toInt, sensor5.toInt, sensor6.toInt, sensor7.toInt, sensor8.toInt, sensor9.toInt, sensor10.toInt, sensor11.toInt)
case _ => deserializationError("Sensor Data record expected")
}
}
implicit val dataRecordFormat = jsonFormat3(DataRecord)
}
object JsonSizePoc {
val r = Random
r.setSeed(12345)
def nextValue: Int = r.nextInt(1023)
def newSensorRecord:SensorRecord = {
SensorRecord(ZonedDateTime.now(), nextValue, nextValue, nextValue, nextValue, nextValue, nextValue, nextValue, nextValue, nextValue, nextValue, nextValue)
}
def printSize(data: String) = {
println(s"${data.length} bytes")
println(s"${data.length/1024}Kb")
println(s"${data.length/1024/1024}Mb")
}
def main(args: Array[String]) {
import SensorDataProtocol._
val tmp = DataRecord("exercise_1", "glove_1", List(newSensorRecord))
println(tmp.toJson)
val cnt = 15 * 60 * 100
println(cnt)
val records = List.fill(cnt)(newSensorRecord)
val dataRecord = DataRecord("id1", "glove1", records)
println(" Raw")
printSize(dataRecord.toJson.toString)
val y = new ByteArrayOutputStream()
val x = new GZIPOutputStream(y)
x.write(dataRecord.toJson.toString().getBytes)
x.flush()
println("Zipped")
printSize(y.toString)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment