Channing vs Open addressing HashTable
Em có tìm đọc được 1 tài liệu về HashTable ở link này, và có 1 vài thắc mắc. <a href="https://www.algolist.net/Data_structures/Hash_table/Open_addressing" target="_blank">https://www.algolist.net/Data_structures/Hash_table/Open_addressing</a>
<ul>
<li>Khi dùng Channing HashTable, ta phải dùng 1 LinkedList gây overhead, khi dùng OpenAdressing thì cũng phải dùng 1 cấu trúc dữ liệu để lưu cặp key, value vẫn tăng heap size</li>
<li>Open addressing (OA) còn gây nghẽn với "DELETE slot" buộc phải rehash lại table, vậy đâu là lí do để dùng OA hasing? Theo em biết thì Java cũng implement HashMap bằng chainning.</li></ul>
Byte array fragment
Em đang có 1 byte array (Store) dùng để lưu Object đã được serialized, và 1 HashTable để lưu position cho object trong Store, giả sử khi xóa Object đi thì Store sẽ bị phân mảnh, em xin hỏi giải pháp cho trường hợp này.
<img src="/api/v1/media/9aafd211d8d6f739c5ad44c71acc099cfb3da9fb27701796dfb5d5f5b0e234f4.png" alt="byte_mem.png">
<p>
Một vài cách em hiện đang suy nghĩ:
</p>
<ul>
<li>Dùng 1 byte để đánh dấu vùng nhớ đó đã bị xóa, thêm position vào 1 HashSet (Tracker). Khi thêm mới 1 Object sẽ kiểm tra Tracker và tìm vị trí có space đủ để ghi vào, tuy nhiên độ dài Object có thể ít hơn nên space của vùng nhớ đó nên vẫn bị trống 1 phần</li>
<li>Dịch tất cả các Object phía sau lên tương tự như ArrayList, tuy nhiên em lại không biết cách set lại position cho HashTable</li></ul>
Một cách tối ưu để thực hiện delta-load trong ETL
Em đang tìm hiểu về delta-load trong ETL, em đang có 1 mô hình producer-consumer.
<ul>
<li>Consumer sẽ thực hiện logic trên tất cả dữ liệu được publish bởi producer</li>
<li>Producer sẽ thực hiện incremetal write cho tập dữ liệu nhận được. Vấn đề là producer sẽ đóng vai trò như 1 framework và tự động đánh giá nội dung để cho rằng 1 Object có bị thay đổi hay không.</li></ul>
<p>
Em muốn hỏi là coó 1 cách tối ưu nhất để Producer tự extract những Object bị modified không?
</p>
<ul>
<li>Giải pháp hiện tại của em là serialize Object sang byte và thực hiện hash trên byte array đó (giống như commit hash) để lưu trữ state Object đó, tuy nhiên em đang không biết 1 hàm hash hiệu quả cho việc này, xin nhờ mọi người giúp.</li></ul>
Kryo serializer
Em mới tiếp cận việc dùng Kryo cho serializer Object to byte.<p>
Theo em biết thì Kryo cho phép config <code class="markdown-inline">setRegistrationRequired()</code>
</p>
<em>Nếu set <code class="markdown-inline">true</code>, khi dùng writeClassAndObject() Kryo sẽ thêm registrationId vào đầu bytes array để làm header</em>
<em>Nếu <code class="markdown-inline">false</code>, Kryo sẽ tự thêm metadata của class đó.</em>
<p>
Lấy ví dụ em có class TypeA có 1 field <code class="markdown-inline">List<String></code>.
</p>
<p>
Vấn đề nếu set true cho <code class="markdown-inline">setRegistrationRequired()</code> thì khi writeClassAndObject Kryo sẽ dùng runtime type để chọn Serializer phù hợp cho <code class="markdown-inline">List<String></code> (có thể là ArrayList, LinkedList, ...) và giả sử việc <code class="markdown-inline">register</code> các Class phải thực hiện trước khi Kryo write.
</p>
<p>
Trong trường hợp này em sẽ phải register như thế nào nếu có 1 field là Interface (vì không thể register toàn bộ concrete Class của 1 Interface được). Có cách nào để xứ lí không nhỉ?
</p>