Listenin transpozunu almak

Grid gibi, aynı tipten verinin çok fazla sekilde tekrarlandıgı durumlarda, serialization esnasında yazılan metadata yükünden dolayı veriyi taşımak problem olabiliyor.

Misal aşağıdaki gibi bir Row sınıfının olduğunu düşünün;

Sadece Row sınıfı elemanlarından oluşan bir listeyi JSON'a çevirip göndermeye çalıştığımızda elimizdeki mesaj aşağıdaki gibi bir standart JSON mesajı olacak.

Eğer dediğim gibi, göstereceğimiz veri standart bir Row listesiyse, yani Row sınıfından türeyen herhangi bir sınıfın nesnesini barındırmıyorsa, mesaj içinde sürekli tekrarlanan alan adlarından kurtulmak için listenin transpozunu alabiliriz.

Listenin transpozunu almanın lineer cebirde matrisler üzerinde uygulanan transpoz işleminden bir farkı yok aslında. Örneğin nasıl ki

\[M = \begin{pmatrix}1 & 2 \\ 3 & 4\end{pmatrix}\]

şeklindeki bir matrisin transpozu

\[M^T = \begin{pmatrix}1 & 3 \\ 2 & 4\end{pmatrix}\]

ise, yani satırlarla sütunlar yer değiştiriyorsa liste üzerinde de aynı işlemi yapacağız.

Obje Col1 Col2 Col3 Col4 Col5
Obj1 Column1 Column2 Column3 0 0
Obj2 Column1 Column2 Column3 1 3.1415926535897931

şeklindeki bir obje listesinin transpozu

Obj1 Obj2
Col1 Column1 Column1
Col2 Column2 Column2
Col3 Column3 Column3
Col4 0 1
Col5 0 3.1415926535897931

olacak. Böylece artık her satırda nesne yerine primitif listesi gönderebiliriz.

Aşağıdaki kod basit bir şekilde bu işlemi yapıyor.

Artık göndereceğimiz veri aşağıdaki gibi

Böylece, eleman sayılarına göre mesaj boyutlarındaki değişim aşağıdaki gibi olacak.

Eleman Sayısı Normal(byte) Transpoz(byte)
2 162 133
1000 89674 52719
10000 906712 536757
100000 9167843 5467888

Dolu tabloların iletiminde bu yöntem etkin bir çözüm sağlıyor. Boşa yakın (sparse) tablolarda ya da değişik obje tipleri içeren durumlarda ise çok fazla bir yarar sağlamayacaktır.

Paralel JSON Parser

List, Map gibi, elemanları paralelde ayrı olarak işlenebilecek veri yapılarının birden fazla thread'le işlenebileceği ile ilgili bir fikir vardı aklımda bir zamandır. Şirketimiz sağolsun bana zorunlu olarak "Design Patterns" eğitimi atayınca ben de eğitimde kendime ayırdığım boş zamanların bir kısmında paralel çalışan bir JSON parser yazmayı deneyeyim dedim :)

Kodun, README'de de görülebileceği üzere, epey bir eksiği var. Hatta işe yarar bir koddan daha çok bir taslak diyebilirim. Fakat bu haliyle bile denediğimde yine de fena çalışmadığını görüyorum (1.000.000'luk bir Map objesinde JVM OutOfMemoryException falan atıyor ama olsun :)). Fırsat buldukça geliştirmeye çalışacağım, belki işe yarar bir şey çıkar sonunda.

https://github.com/ocozalp/ParallelJSON