Skip to content

Seek to frame numbers #19

Description

@bebehei

I'm currently testing the zstd seekable frame format. I'm missing to seek to a specific frame instead to its byte position.

from pyzstd import SeekableZstdFile, ZstdFile

FILENAME="framed.zst"

with SeekableZstdFile(FILENAME, 'w') as filewriter:
    filewriter.write(b"first_frame")
    filewriter.flush(mode=ZstdFile.FLUSH_FRAME)
    filewriter.write(b"second_frame")
    filewriter.flush(mode=ZstdFile.FLUSH_FRAME)
    filewriter.write(b"third_frame")
    filewriter.close()

with SeekableZstdFile(FILENAME, 'r') as filereader:
    # Feature Request: Seek to frame numbers
    filereader.seek_to_frame(-1)
    # Prints out `third_frame`
    print(filereader.read())

I've got a big file (about 600GB uncompressed), which I read and segment logically into zstd frames via SeekableZstdFile.flush as written in the example above.

After all data is compressed, I flush again the data and then I also add an index of every segement with the metadata as an additional frame. This index ist just a JSON serialized text.

To find that metadata JSON, the program must do some weird binary search now. Since it's already exposed in its own frame, simply jumping to the last frame would do it as O(1).


zstd exposes the frame data in its .h files too: https://github.com/facebook/zstd/blob/20707e3718ee14250fb8a44b3bf023ea36bd88df/contrib/seekable_format/zstd_seekable.h#L199-L220

Is it possible to expose this in the python module, too?

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions