2009-06-11 7 views
4

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

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

ответ

4

Для шестнадцатеричного редактора, нет никакого СВАО, чтобы прочитать весь файл в память. Пользователь может просматривать или изменять данные, но не вставлять и не удалять.

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

3

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

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

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

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

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

+1

Так что, может быть, I/O будет отдельным потоком из графического интерфейса? Затем, если GUI попытался просмотреть данные, которые еще не были получены, я мог бы прервать поток ввода-вывода и получить запрошенные данные. – samoz

+0

@Samoz - Это точно правильный подход - не блокируйте поток пользовательского интерфейса на IO. – Michael

3

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

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

+0

Я думал, что пропускная способность будет мешать ему, но все же решил, что я спрошу. – samoz

+0

+1 для асинхронного ввода-вывода. Не могу поверить, что я об этом не думал. Это определенно самый разумный способ ... – Zifre

+0

Что именно означает асинхронный ввод-вывод? – samoz

0

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

1

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

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

Смежные вопросы