Search Results for

    Large Objects

    The Large Objects feature is a way of storing large files in a PostgreSQL database. Files can normally be stored in bytea columns but there are two downsides; a file can only be 1 GB and the backend buffers the whole file when reading or writing a column, which may use significant amounts of RAM on the backend.

    With the Large Objects feature, objects are instead stored in a separate system table in smaller chunks and provides a streaming API for the user. Each object is given an integral identifier that is used for accessing the object, that can, for example, be stored in a user's table containing information about this object.

    Example

    // Retrieve a Large Object Manager for this connection
    var manager = new NpgsqlLargeObjectManager(Conn);
    
    // Create a new empty file, returning the identifier to later access it
    uint oid = manager.Create();
    
    // Reading and writing Large Objects requires the use of a transaction
    using (var transaction = Conn.BeginTransaction())
    {
        // Open the file for reading and writing
        using (var stream = manager.OpenReadWrite(oid))
        {
            var buf = new byte[] { 1, 2, 3 };
            stream.Write(buf, 0, buf.Length);
            stream.Seek(0, System.IO.SeekOrigin.Begin);
    
            var buf2 = new byte[buf.Length];
            stream.Read(buf2, 0, buf2.Length);
    
            // buf2 now contains 1, 2, 3
        }
        // Save the changes to the object
        transaction.Commit();
    }
    

    See also

    See the PostgreSQL documentation for more information. All functionality are implemented and wrapped in the classes NpgsqlLargeObjectManager and NpgsqlLargeObjectStream using standard .NET Stream as base class.

    • Edit this page
    In this article
    Back to top © Copyright 2023 The Npgsql Development Team