sparrow 0.9.0
|
The two following examples initialize a sparrow array and then get the internal Arrow C structures. The only difference is the ownership of these structures.
In this example, we take ownership of the Arrow structures allocated by the sparrow array. This latter must not be used after, and it is our responsibility to release the C structures when we don't need them anymore.
In this example, the sparrow array keeps the ownership of its internal Arrow structures, making it possible to continue using it independently. We must NOT release the Arrow structures after we don't need them; the sparrow array will do it.
In the following examples, we read Arrow data via a third party library and we get Arrow C structures. We use them to initialize a sparrow (untyped) array. Like the previous examples, the only difference is how we handle the ownership of the C structures.
In this example, we keep the ownership of the Arrow structures. The sparrow array will simply reference them internally, but it will not release them when it goes out of scope. We are responsible for doing it.
In this example, we transfer the ownership of the Arrow C structures to the sparrow array. It will release them when it is destroyed.
This example demonstrates how to apply an algorithm to an untyped array using the sparrow::array::visit method. This method determines the type of the internal array that stores the data and passes it to the user-defined functor. As a result, the functor must be designed to handle any typed array provided by Sparrow.
For performance-critical applications, Sparrow provides zero copy constructors that avoid unnecessary data copying. When constructing dictionary encoded arrays and other specialized array types, you can achieve zero copy operations by using constructors that accept sparrow::u8_buffer
as input parameters. The u8_buffer
type is specifically designed to wrap existing memory buffers without performing any data copying, allowing you to directly use pre-allocated memory regions.
When using constructors that take ranges or standard containers as input, Sparrow typically needs to copy the data into its internal buffer structures. However, constructors accepting sparrow::u8_buffer
parameters can take ownership of existing memory buffers or create views over them, eliminating the need for data copying. This is particularly beneficial when working with large datasets or when integrating with external libraries that already have data in the appropriate memory layout.
To utilize zero copy operations, construct your arrays using the overloads that accept sparrow::u8_buffer
objects for buffer parameters such as keys, values, or validity bitmaps. This approach provides optimal performance by reusing existing memory allocations while maintaining Sparrow's type safety and API consistency.