Как параллелизировать чтение файла и запись

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

Моя начальная буква думала, используйте 2 потока в качестве примера, одного чтения-записи потока с начала и другого чтения-записи потока с середины файла. Так как мои файлы отформатированы как строки, не байты (каждая строка может иметь различные байты данных), ищите байтом, не работает на меня. И решением, о котором я мог думать, является использование getline () для перескакивания через предыдущие строки сначала, которые могли бы быть не эффективными.

Там какой-либо хороший путь состоит в том, чтобы искать на указанную строку в файле? или у Вас есть какие-либо другие идеи parallize чтению файла и записи?

Среда: Win32, C++, NTFS, единственный жесткий диск

Спасибо.

- Dbger

10
задан Baiyan Huang 3 January 2010 в 02:26
поделиться

3 ответа

Вообще говоря, вы не хотите распараллелизировать диск ввода / вывода. Жесткие диски не любят случайных ввода / вывода, потому что они должны постоянно искать вокруг, чтобы добраться до данных. Предполагая, что вы не используете RAID, и вы используете жесткие диски, в отличие от какой-либо твердой памяти, вы увидите серьезную деградацию производительности, если вы параллелизуете ввод / вывод (даже при использовании таких технологий, вы все еще можете увидеть некоторые результаты деградация при совершении много случайных ввода / вывода).

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

20
ответ дан 3 December 2019 в 16:52
поделиться

Это на самом деле не ответ на ваш вопрос, а скорее переделка (которую мы все ненавидим, но не можем не делать). Как уже упоминалось, попытка ускорить ввод/вывод на жестком диске с несколькими потоками, вероятно, не поможет.

Однако, в зависимости от чувствительности данных, потребностей в пропускной способности, размера данных и т.д., можно использовать другой подход. Не составит труда создать в памяти структуру, поддерживающую картину данных и позволяющую легко/быстро обновлять строки текста в любом месте данных. Затем можно использовать выделенный поток, который просто контролирует эту структуру и чья задача состоит в записи данных на диск. Запись данных последовательно на диск может быть чрезвычайно быстрой; это может быть намного быстрее, чем случайный поиск различных секций и запись их по частям

.
1
ответ дан 3 December 2019 в 16:52
поделиться

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

.
3
ответ дан 3 December 2019 в 16:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: