2013-11-12 5 views
0

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

+0

Какую операционную систему вы используете? Многие из них реализуют автоматическое считывание, поэтому вам не нужно это делать. И если вы используете буферизованный ввод-вывод, вы не читаете строку за раз из файла, вы читаете большой блок, например, 4 КБ. – Barmar

+0

Похоже, вы хотите _optimise_, а не [refactor] (http://c2.com/cgi/wiki?WhatIsRefactoring). – groverboy

+0

Зачем вам нужно улучшить производительность, т.е. каким образом (-ы) приложение работает плохо? Невосприимчивый пользовательский интерфейс? Медленная пропускная способность и доступные ядра не используются? Другие? – groverboy

ответ

2

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

Насколько велик буфер, зависит от библиотеки времени выполнения и, возможно, от того, как вы инициализируете файл.

Кроме того, файловая система, вероятно, поддерживает еще больший буфер. Например, ваша библиотека времени выполнения может иметь 4 килобайтный файловый буфер, а операционная система может буферизировать входной файл в 64 килобайтных блоках.

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

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

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