Чтение одного файла из нескольких потоков в python

Я пишу многопоточный декомпрессор на python. Каждому потоку требуется доступ к разному фрагменту входного файла.

Примечание 1: невозможно загрузить файл целиком, так как он составляет от 15 до 200 ГБ; Я использую не многопоточность для ускорения чтения данных, а декомпрессию данных, я просто хочу убедиться, что чтение данных не замедляет декомпрессию.

Примечание 2: GIL здесь не проблема, поскольку основная функция декомпрессора является расширением C и вызывает Py_ALLOW_THREADS, так что GIL освобождается при распаковке. На втором этапе декомпрессии используется numpy, который также не содержит GIL.

1) Я предполагал, что просто не сработает просто разделить объект Decompressor (который, по сути, является оболочкой для файлового объекта), поскольку, если поток A вызывает следующее:

decompressor.seek(x)
decompressor.read(1024)

и поток B делает то же самое, поток A может закончить чтение от смещения резьбы B. Это правильно?

2) Прямо сейчас я просто заставляю каждый поток создавать свой собственный экземпляр Decompressor, и кажется, что это работает, но я не уверен, что это лучший подход. Я рассмотрел эти возможности:

  • Добавьте что-нибудь вроде

     seekandread (from_where, length)
    

    классу Decompressor, который получает блокировку, ищет, считывает и снимает блокировку;

  • Создает поток, который ожидает запросов на чтение и выполняет их в правильном порядке.

Итак, я упускаю очевидное решение? Есть ли значительная разница в производительности между этими методами?

Спасибо

7
задан Alberto 7 February 2012 в 16:24
поделиться