2013-08-10 22 views
14

Nếu tôi có biểu đồ đối tượng lồng nhau của các lớp chữ, tương tự như ví dụ bên dưới và tôi muốn lưu trữ bộ sưu tập của chúng trong danh sách redis, tôi nên xem thư viện hoặc công cụ nào tại đó sẽ cho chuyến đi khứ hồi tổng thể nhanh nhất đến redis?Serialization/deserialization nhanh nhất của Scala case classes

này sẽ bao gồm:

  • Thời gian để sắp đặt từng mục
  • chi phí mạng lưới chuyển dữ liệu serialized
  • chi phí mạng thu hồi được lưu trữ dữ liệu đăng
  • thời gian để deserialize trở lại vào trường hợp lớp

    case class Person(name: String, age: Int, children: List[Person]) {} 
    

Trả lời

25

CẬP NHẬT (2018): scala/tẩy không còn được duy trì tích cực nữa. Có các kho lưu trữ của các thư viện khác đã phát sinh như là các lựa chọn thay thế có cách tiếp cận tương tự nhưng có xu hướng tập trung vào các định dạng tuần tự cụ thể; ví dụ: JSON, nhị phân, protobuf.

Trường hợp sử dụng của bạn chính xác là trường hợp sử dụng được nhắm mục tiêu cho scala/pickling (https://github.com/scala/pickling). Tuyên bố từ chối trách nhiệm: Tôi là tác giả.

Scala/pickling được thiết kế để thay thế nhanh hơn, an toàn hơn và cởi mở hơn cho các khung công tác tự động như Java hoặc Kryo. Nó được xây dựng đặc biệt cho các ứng dụng phân tán, do đó thời gian tuần tự hóa/deserialization và kích thước dữ liệu tuần tự chiếm một ghế trước. Phải mất một cách tiếp cận khác nhau để serialization tất cả cùng nhau - nó tạo ra pickling (serialization) mã nội tuyến tại các trang web sử dụng tại thời gian biên dịch, do đó, nó thực sự rất nhanh.

Các tiêu chuẩn mới nhất là trong OOPSLA paper của chúng ta - cho định dạng dưa nhị phân (bạn cũng có thể chọn người khác, như JSON) scala/tẩy là luôn nhanh hơn Java và Kryo, và tạo ra cơ quan đại diện nhị phân mà là ngang bằng hoặc nhỏ hơn Kryo của , có nghĩa là độ trễ ít hơn khi truyền dữ liệu đã được chọn của bạn qua mạng.

Mọi chi tiết, có một trang dự án: http://lampwww.epfl.ch/~hmiller/pickling

Và một ScalaDays 2013 talk from June on Parley's.

Chúng tôi cũng sẽ trình bày một số phát triển mới liên quan đến việc xử lý việc đóng cửa qua mạng tại Strange Loop 2013, trong trường hợp đó cũng có thể là điểm đau cho trường hợp sử dụng của bạn.

Tính đến thời điểm viết bài này, scala/pickling đang được phát hành trước, với bản phát hành ổn định đầu tiên của chúng tôi dự kiến ​​vào ngày 21 tháng 8.

+0

Điều đó có vẻ khá hữu ích, nhưng github trang hơi ngắn. Tôi chắc chắn sẽ có một cái nhìn tại những người trông và cảm ơn cho trả lời. – user2668128

+0

* liên kết. Btw, JSON có phải là định dạng tốt nhất cho hiệu suất hay chỉ là ví dụ về github? – user2668128

+1

Vâng, chúng tôi đang nghiên cứu tài liệu. Sẽ có nhiều hướng dẫn sử dụng trong tuần tới hoặc hai cùng với bản phát hành. Định dạng nhị phân của chúng tôi là định dạng được điều chỉnh hiệu suất nhất của chúng tôi. Mặc dù JSON cũng khá nhanh (chúng tôi chưa xuất bản tiêu chuẩn toàn diện cho JSON). –

6

Cập nhật:

Bạn phải cẩn thận khi sử dụng các phương pháp tuần tự hóa từ JDK. Hiệu suất không phải là tuyệt vời và một thay đổi nhỏ trong lớp học của bạn sẽ làm cho dữ liệu không thể deserialize.


Tôi đã sử dụng scala/pickling nhưng nó có khóa toàn cầu trong khi tuần tự hóa/deserializing.

Vì vậy, thay vì sử dụng nó, tôi viết riêng mã serialization/deserialization của tôi như thế này:

import java.io._ 

object Serializer { 

    def serialize[T <: Serializable](obj: T): Array[Byte] = { 
    val byteOut = new ByteArrayOutputStream() 
    val objOut = new ObjectOutputStream(byteOut) 
    objOut.writeObject(obj) 
    objOut.close() 
    byteOut.close() 
    byteOut.toByteArray 
    } 

    def deserialize[T <: Serializable](bytes: Array[Byte]): T = { 
    val byteIn = new ByteArrayInputStream(bytes) 
    val objIn = new ObjectInputStream(byteIn) 
    val obj = objIn.readObject().asInstanceOf[T] 
    byteIn.close() 
    objIn.close() 
    obj 
    } 
} 

Dưới đây là một ví dụ của việc sử dụng nó:

case class Example(a: String, b: String) 

val obj = Example("a", "b") 
val bytes = Serializer.serialize(obj) 
val obj2 = Serializer.deserialize[Example](bytes) 
Các vấn đề liên quan