Libbson
Libbson is a new shared library written in C for developers wanting to work with the BSON serialization format. Its API will feel natural to C programmers but can also be used as the base of a C extension in higher-level MongoDB drivers. T
Libbson is a new shared library written in C for developers wanting to work with the BSON serialization format.
Its API will feel natural to C programmers but can also be used as the base of a C extension in higher-level MongoDB drivers.
The library contains everything you would expect from a BSON implementation. It has the ability to work with documents in their serialized form, iterating elements within a document, overwriting fields in place, Object Id generation, JSON conversion, data validation, and more. Some lessons were learned along the way that are beneficial for those choosing to implement BSON themselves.
Improving small document performance
A common use case of BSON is for relatively small documents. This has a profound impact on the memory allocator in userspace, causing what is commonly known as “memory fragmentation”. Memory fragmentation can make it more difficult for your allocator to locate a contiguous region of memory.
In addition to increasing allocation latency, it increases the memory requirements of your application to overcome that fragmentation.
To help with this issue, the bson_t structure contains 120 bytes of inline space that allows BSON documents to be built directly on the stack as opposed to the heap.
When the document size grows past 120 bytes it will automatically migrate to a heap allocation.
Additionally, bson_t will grow it’s buffers in powers of two. This is standard when working with buffers and arrays as it amortizes the overhead of growing the buffer versus calling realloc() every time data is appended. 120 bytes was chosen to align bson_t to the size of two sequential cachelines on x86_64 (each 64 bytes).
This may change based on future research, but not before a stable ABI has been reached.
Single allocation for nested documents
One strength of BSON is it’s ability to nest objects and arrays. Often times when serializing these nested documents, each sub-document is serialized independently and then appended to the parents buffer.
As you might imagine, this takes quite the toll on the allocator. It can generate many small allocations which were only created to have been immediately discarded after appending to the parents buffer. Libbson allows for building sub-documents directly into the parent documents buffer.
Doing so helps avoid this costly fragmentation. The topmost document will grow its underlying buffers in powers of two each time the allocation would overflow.
Parsing BSON documents from network buffers
Another common area for allocator fragmentation is during BSON document parsing. Libbson allows parsing and iteration of BSON documents directly from your incoming network buffer.
This means the only allocations created are those needed for your higher level language such as a PyDict if writing a Python extension.
Developers writing C extensions for their driver may choose to implement a “generator” style parsing of documents to help keep memory fragmentation low.
A technique we’re yet to explore is implementing a hashtable-esque structure backed by BSON, only deserializing the entire buffer after a threshold of keys have been accessed.
Generating BSON documents into network buffers
Much like parsing BSON documents, generating documents and placing them into your network buffers can be hard on your memory allocator. To help keep this fragmentation down, Libbson provides support for serializing your document to BSON directly within a buffer of your choosing.
This is ideal for situations such as writing a sequence of BSON documents into a MongoDB message.
Generating Object Ids without Synchronization
Applications are often doing ObjectId generation, especially in high insert environments. The uniqueness of generated ObjectIds is critical to avoiding duplicate key errors across multiple nodes.
Highly threaded environments create a local contention point slowing the rate of generation. This is because the threads must synchronize on the increment counter of each sequential ObjectId. Failure to do so could cause collisions that would not be detected until after a network round-trip. Most drivers implement the synchronization with an atomic increment or a mutex if atomics are not available.
Libbson will use atomic increments and in some cases avoid synchronization altogether if possible. One such case is a non-threaded environment.
Another is when running on Linux as both threads and processes are in the same namespace.
This allows the use of the thread identifier as the pid within the ObjectId.
You can find Libbson at https://github.com/mongodb/libbson and discuss design choices with its author, Christian Hergert, who can be found on twitter as @hergertme.
原文地址:Libbson, 感谢原作者分享。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Kata Pengantar: Di tempat kerja, saya menemui projek Javaweb yang dibina dengan rangka kerja springboot yang diperlukan untuk menyepadukan fungsi tolak pihak ketiga, jadi saya menggunakan perkhidmatan tolak Xiaomi dan memuat turun pakej balang yang berkaitan. Memperkenalkan balang tempatan ke dalam projek bukanlah masalah besar Selepas menulis kod, tiada masalah untuk lulus ujian kelas ujian. Kemudian bersedia untuk membungkus dan menggunakan pelayan pembangunan. Memandangkan projek itu digunakan melalui tomcat, kaedah pembungkusan adalah ke dalam pakej perang. Selepas pembungkusan, muat naik ke pelayan pembangunan Selepas permulaan yang berjaya, saya pergi untuk menguji antara muka push bertulis dan mendapati ia gagal. Melalui analisis, didapati bahawa direktori lib dalam perang berpakej di mana balang bergantung projek disimpan tidak mengandungi pakej balang berkaitan tolak yang diperkenalkan secara tempatan. Selepas bergelut selama setengah jam, masalah itu telah diselesaikan. selesaikan

Di Linux, lib ialah direktori fail perpustakaan, yang mengandungi semua fail perpustakaan yang berguna kepada sistem fail perpustakaan adalah fail yang diperlukan untuk pelaksanaan aplikasi, arahan atau proses yang betul. Peranan lib adalah serupa dengan fail DLL dalam Windows Hampir semua aplikasi perlu menggunakan fail perpustakaan kongsi dalam direktori lib. lib ialah singkatan Pustaka (perpustakaan) Direktori ini menyimpan perpustakaan kongsi pautan dinamik yang paling asas bagi sistem, dan fungsinya serupa dengan fail DLL dalam Windows. Hampir semua aplikasi memerlukan penggunaan perpustakaan kongsi ini. Folder /lib ialah direktori fail perpustakaan dan mengandungi semua fail perpustakaan yang berguna kepada sistem. Ringkasnya, ia adalah fail yang diperlukan untuk pelaksanaan yang betul bagi aplikasi, arahan atau proses. dalam/bi

1. Konsep Dalam bahasa Java, ungkapan "baru" bertanggungjawab untuk mencipta contoh, di mana pembina dipanggil untuk memulakan contoh; jenis nilai pulangan pembina itu sendiri adalah tidak sah, bukan "pembina mengembalikan yang baru dibuat Rujukan objek", tetapi nilai ungkapan baharu ialah rujukan kepada objek yang baru dibuat. 2. Tujuan: Mencipta objek kelas baharu 3. Mekanisme kerja: Peruntukkan ruang memori untuk ahli objek, dan nyatakan nilai lalai secara eksplisit, lakukan pengiraan kaedah pembinaan, dan kembalikan nilai rujukan dengan kerap bermakna membuka yang baru dalam ingatan Ruang memori diperuntukkan dalam kawasan timbunan dalam ingatan Ia dikawal oleh jvm dan menguruskan memori secara automatik. Di sini kita menggunakan kelas String sebagai contoh. Pu

Perbezaan: 1. Make hanya boleh digunakan untuk memperuntukkan dan memulakan data jenis slice, map dan chan manakala baru boleh memperuntukkan sebarang jenis data. 2. Peruntukan baru mengembalikan penunjuk, iaitu jenis "*Jenis" manakala membuat pulangan rujukan, iaitu Jenis. 3. Ruang yang diperuntukkan oleh baru akan dikosongkan selepas membuat memperuntukkan ruang, ia akan dimulakan.


Bagaimanakah operator baharu dalam js berfungsi? Contoh kod khusus diperlukan. Fungsinya adalah untuk mencipta objek contoh baharu berdasarkan pembina yang ditentukan dan mengembalikan rujukan kepada objek. Apabila menggunakan operator baharu, langkah berikut sebenarnya dilakukan: buat objek kosong baharu arahkan prototaip objek kosong ke objek prototaip pembina; objek); jalankan kod dalam pembina dan berikan objek baharu

Penyelesaian kepada Linux tidak menemui lib: 1. Salin perpustakaan lib dalam program ke direktori "/lib" atau "/usr/local/lib", dan kemudian jalankan "ldconfig" 2. Dalam "ld.so.conf "; Tambah direktori di mana fail pustaka terletak, dan kemudian kemas kini fail "ld.so.cache".

Fujifilm telah melihat banyak kejayaan dalam beberapa tahun kebelakangan ini, sebahagian besarnya disebabkan oleh simulasi filemnya dan populariti kamera gaya jarak jari padatnya di media sosial. Walau bagaimanapun, ia nampaknya tidak berpuas hati dengan kejayaannya, menurut Fujirumors. u
