Чтение из файла не построчно - PullRequest
2 голосов
/ 26 июня 2009

Назначение QTextStream для QFile и считывание его построчно легко и работает нормально, но мне интересно, можно ли повысить производительность, сохранив файл в памяти, а затем построчно обработав его -линия.

Используя FileMon от sysinternals, я столкнулся с тем, что файл читается кусками по 16 КБ, и поскольку файлы, которые я должен обработать, не такие большие (~ 2 МБ, но много!), Загрузка их в память было бы неплохо попробовать.

Есть идеи, как мне это сделать? QFile происходит от QIODevice, что позволяет мне ReadAll() преобразовать его в QByteArray, но как действовать дальше и разделить его на строки?

Ответы [ 4 ]

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

QTextStream имеет функцию ReadAll:

http://doc.qt.io/qt-4.8/qtextstream.html#readAll

Конечно, это все, что вам нужно?

Или вы можете прочитать все в QByteArray , и QTextStream может принять это как ввод вместо QFile.

2 голосов
/ 26 июня 2009

Будь осторожен. Есть много эффектов для рассмотрения.

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

На самом деле вызов вашей операционной системы для чтения низкого уровня ОЧЕНЬ дорог. Вот почему мы буферизовали ввод / вывод. Для небольших размеров ввода / вывода преобладают издержки вызова. Таким образом, чтение 64 байтов за раз, вероятно, на 1/4 так же эффективно, как чтение 256 байтов за раз. (И я говорю здесь о read (), а не о fgets () или fread (), которые оба буферизируются.)

В определенный момент время, необходимое для физического ввода-вывода, начинает доминировать, и когда производительность при увеличении размера буфера не увеличивается, вы нашли размер буфера. Очень старая точка данных: 7 МГц Amiga 500, жесткий диск SCSI 100 МБ (A590 + Quantum): моя производительность ввода-вывода действительно достигла максимума только при размере буфера 256 КБ. По сравнению с процессором этот диск был БЫСТРОМ !!! (На компьютере было всего 3 МБ ОЗУ. 256 КБ - БОЛЬШОЙ буфер!)

Однако вы можете получить слишком много хорошего. Как только ваш файл находится в памяти, ОС может вывести этот файл обратно на диск на досуге. И если это так, вы потеряли какую-либо выгоду от буферизации. Если вы сделаете свои буферы слишком большими, это может произойти при определенных ситуациях нагрузки, и ваша производительность ухудшится. Поэтому внимательно изучите среду выполнения и при необходимости ограничьте объем памяти.

Альтернативой является использование mmap () для отображения файла в памяти. Теперь ОС не будет выгружать ваш файл - скорее, она просто не будет перелистывать страницу, или, если ей понадобится память, она будет отбрасывать любые части файла, кэшированные в ядре. Но ему не нужно ничего писать, чтобы поменять место - у него есть доступный файл. Однако я не уверен, приведет ли это к повышению производительности, поскольку все еще лучше выполнять ввод-вывод большими блоками, а виртуальная память имеет тенденцию перемещать вещи в блоках размером с страницу. Некоторые менеджеры памяти могут неплохо выполнять перемещение страниц по частям, чтобы увеличить пропускную способность ввода-вывода и предварительную выборку страниц. Но я на самом деле не изучал это подробно.

Сначала заставьте вашу программу работать правильно. Затем оптимизируйте.

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

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

0 голосов
/ 09 ноября 2013

Вы можете

QTextStream ( QIODevice * device )

Класс QTextStream предоставляет удобный интерфейс для чтения и написание текста.

QTextStream может работать с QIODevice, QByteArray или QString. Используя потоковые операторы QTextStream, вы можете удобно читать и писать слова, строки и цифры.

...