Я пишу многопоточный декомпрессор в python. Каждый поток должен получить доступ к другому фрагменту входного файла.Чтение одного файла из нескольких потоков в python
Примечание 1: невозможно загрузить весь файл, поскольку он колеблется от 15 ГБ до 200 ГБ; Я не использую многопоточность для ускорения чтения данных, но декомпрессии данных, я просто хочу убедиться, что чтение данных не замедляет декомпрессию.
Примечание 2: GIL не является проблемой, поскольку главная функция декомпрессора является расширением C и вызывает Py_ALLOW_THREADS, так что GIL освобождается при распаковке. Декомпрессия второй ступени использует numpy, который также не является GIL-бесплатным.
1) Я предполагал, что это не будет работать, чтобы просто поделиться объект декомпрессор (который в основном оборачивает объект файла), так как если поток А вызывает следующее:
decompressor.seek(x)
decompressor.read(1024)
и нити B делает то же самое, нить A может закончиться чтением из коррекции потока B. Это верно?
2) Прямо сейчас я просто создаю каждый поток, создавая свой собственный экземпляр Decompressor, и, похоже, он работает, но я не уверен, что это лучший подход. Я рассмотрел эти возможности:
Добавить что-то вроде
seekandread(from_where, length)
к классу декомпрессор, который приобретает замок, ищет, читает и освобождает замок;
Создайте поток, который ждет запросов на чтение и выполняет их в правильном порядке.
Итак, у меня отсутствует очевидное решение? Существует ли существенная разница в производительности между этими методами?
Благодаря
Чтение файла в многопоточном режиме фактически замедляет процесс, когда у вас есть жесткий диск. Игла должна прыгать с одного места на другое, а не работать в итеративном режиме. Вы должны загрузить файл перед его обработкой. –
Невозможно загрузить весь файл, поскольку он колеблется от 15 Гб до 200 Гб; Я не использую многопоточность для ускорения чтения данных, но декомпрессии данных, я просто хотел убедиться, что чтение данных не замедляет декомпрессию. – Alberto
Конечно, это может быть или не относится к твердотельным накопителям. Однако я понятия не имею о предмете. Вы не должны ретранслировать оборудование, чтобы это сделать. Как только SSD достаточно распространены, выполнение ввода-вывода в многопоточном режиме может быть эффективным. –