Многопоточный доступ к файлам - PullRequest
4 голосов
/ 11 июня 2009

Я пишу программу для шестнадцатеричного редактора, и я думал о том, когда пользователь пытается открыть очень большой файл (3 ГБ +). Я бы не хотел, чтобы пользователь сидел весь день, пока весь файл загружался, когда в него уже загружены некоторые данные.

Итак, вот мой вопрос: возможно ли, чтобы несколько потоков читали файл (не записывали) одновременно в разных местах, а затем, когда определенный порог данных был прочитан 1, этот поток отображал свои данные а остальные продолжают читать? Это предложит мне улучшение производительности? Или пропускная способность памяти уменьшит любое увеличение скорости, которое я мог бы получить, используя несколько потоков?

Ответы [ 6 ]

4 голосов
/ 14 июня 2009

Для hex-редактора нет необходимости читать весь файл в память. Пользователь может только просматривать или изменять данные, но не вставляя и не удаляя.

Вы можете просто использовать отображенные в память файлы. Данные будут автоматически считываться при доступе, и будет считываться только отображенный фрагмент. Это обеспечивает быструю прокрутку и переход в любое место файла.

3 голосов
/ 11 июня 2009

Я не уверен, какой перфоманс вы ожидаете. , , с диска идет один поток данных, и чтение нескольких потоков с диска только увеличит конфликт и, возможно, приведет к замедлению, поскольку головка диска подпрыгивает назад и вперед из-за конкурирующих запросов.

Вместо этого вам следует заняться асинхронным вводом-выводом и обработкой данных, как только они появятся, чтобы приложение стало отзывчивым.

3 голосов
/ 11 июня 2009

Возможно, вы не хотите использовать несколько потоков. Даже на многоядерном процессоре есть только один путь к диску, поэтому вы, вероятно, не получите выигрыша в производительности (доступ к диску * на 1001 * намного медленнее, чем к памяти).

У вас есть хорошая идея с загрузкой и отображением маленьких битов одновременно. Просто сделай это в одной ветке. Прочитайте примерно первый мегабайт, отобразите его, а затем выполните следующий в фоновом режиме и т. Д.

И вы правы, что вам может понадобиться отдельный поток для GUI. Это одна из причин, почему BeOS была настолько невероятно отзывчивой по сравнению с другими ОС того времени. Для разных задач использовалось много разных потоков.

Только не ожидайте, что чтение нескольких потоков с диска поможет.

Кроме того, вы можете использовать aio_read() для асинхронного ввода-вывода в Linux. Если вы используете Windows, попробуйте прибегнуть к помощи «асинхронного ввода-вывода Windows» (я не совсем уверен, как вы это делаете; я не использую Windows).

1 голос
/ 14 июня 2009

Как сказал @bill, вы захотите использовать отображенные в памяти файлы. Я думаю, вы найдете очень полезными следующие уроки:

Приведенные выше учебники должны предоставить вам всю необходимую информацию.

1 голос
/ 11 июня 2009

забудьте о прочтении всего файла. просто читайте небольшие блоки, когда это нужно пользователю. в шестнадцатеричном редакторе это еще проще, поскольку содержимое не влияет на макет.

Чтение полного экрана данных выполняется за миллисекунды, пользователь не поймет, что это сделано при перемещении, вместо того, чтобы заранее прочитать все данные

0 голосов
/ 11 июня 2009

Думаю, вам лучше использовать асинхронный неблокирующий ввод-вывод. Это означает, что вы можете отправить запрос на чтение, затем продолжить обработку, а затем перейти к получению результатов запроса. Таким образом, один поток может перекрывать обработку и ввод-вывод. Немного поиска по Google найдет документацию по API для вашей платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...