Latar Belakang: Saya sedang menulis kode micro controller C untuk menulis file EBML. EBML seperti XML biner dengan elemen bersarang, tetapi alih-alih tag awal dan akhir, ada ID awal, panjang, dan kemudian data. Saya menulis ini ke Flash eksternal dalam aplikasi daya rendah, jadi saya ingin menjaga agar flash mengakses seminimal mungkin. Memori juga terbatas, karena tidak ada yang mudah.
Ketika saya bisa menyimpan seluruh elemen EBML dalam memori, kemudian membuatnya mudah karena saya bisa kembali dan mengisi panjang setiap elemen setelah saya tahu berapa panjangnya. Masalahnya adalah apa yang harus dilakukan ketika saya tidak dapat menahan seluruh elemen dalam memori. Pilihan yang saya lihat adalah:
- Tulis apa yang saya tahu, lalu kembali dan tambahkan panjangnya (termudah, tetapi tambahkan lebih banyak akses flash daripada yang saya inginkan)
- Hitung panjang setiap elemen sebelum saya mulai menulisnya (relatif mudah, tetapi banyak waktu prosesor)
- Beralih mode begitu ingatan saya terisi, sehingga saya kemudian melanjutkan melalui data, tetapi hanya untuk menghitung panjang untuk elemen yang sudah disimpan dalam memori. Kemudian tulis apa yang ada dalam memori saya, dan kembali dan lanjutkan memproses data dari tempat saya tinggalkan. (Pilihan favorit saya sejauh ini)
- Berikan elemen panjang kasus maksimum atau terburuk ketika mereka perlu ditulis dan panjang akhir mereka belum diketahui. (Lebih mudah daripada di atas, tetapi bisa menjadi bumerang dan membuang-buang ruang)
Pertanyaan: Sepertinya ini seharusnya menjadi masalah yang relatif umum yang dipikirkan orang. Saya tahu itu juga bisa terjadi ketika membentuk beberapa paket data. Apakah ada teknik yang lebih baik / lebih umum / lebih diterima yang saya lewatkan di sini? Atau hanya beberapa istilah untuk masalah yang bisa saya cari?
sumber
Jawaban:
Jika Anda tidak tahu berapa lama muatan Anda akan, itu jarang menimbulkan kekhawatiran bahkan jika Anda tidak dapat mengingat posisi dan mengisi ulang panjangnya nanti:
Catat "ukuran tidak diketahui".
Fitur itu tergantung pada payload yang terdiri dari elemen-elemen EBML dan elemen berikut ini yang tidak menjadi elemen anak yang valid.
Jika mau, nanti Anda bisa mengkanoniskan EBML offline yang dihasilkan sesuka Anda, misalnya "tanpa ukuran yang tidak diketahui, ukuran minimal" atau "ukuran minimal, hindari ukuran yang tidak diketahui".
Lihat Draft EBML RFC di matroska.org untuk detailnya.
sumber
Jika satu elemen dengan jumlah subelemen tetap terlalu besar, maka mungkin Anda harus mencoba membaginya dalam skema. Saya tidak tahu format ini, tetapi kemungkinan besar Anda bisa menentukan panjang maksimum di dalamnya.
Untuk urutan Anda bisa mencoba menentukan jumlah maksimum sub-bagian dan "streaming" yang tersisa di file berikutnya
Untuk elemen yang berpotensi melebihi ukuran memori maksimal, siapkan tumpukan yang berisi pasangan: lokasi panjang elemen yang dicadangkan dan penghitung panjang. Pada pop simpan penghitung saat ini di penanda saat ini dan tambahkan nilainya ke penghitung berikutnya.
Secara umum cobalah untuk meminimalkan jumlah elemen yang terlalu besar
sumber
KISS dan YAGNI.
Pilih opsi # 1 dan jika itu menjadi masalah nyata - baru kemudian tegaskan kembali.
Setidaknya untuk kasus penggunaan serupa dengan format biner yang serupa, ketika hanya beberapa nilai yang harus diisi sedemikian rupa, ini adalah solusi paling sederhana / termudah / terbaik. Jika Anda harus melakukan ini pada masing-masing dan setiap data - maka itu mungkin merupakan cacat dalam arsitektur.
sumber