Created
April 7, 2016 14:41
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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