Альтернативный более быстрый метод для fscanf в C ++? - PullRequest
0 голосов
/ 04 марта 2011

Я храню свои данные в текстовом файле, используя fprintf("%f\t%f\t%f\t%f\t%f\t%f\n",p1,p2,p3,p4,p5,p6);

. Имеется 100 000 записей, и когда я читаю их, используя

while(!EOF)
  fscanf("%f %f %f %f %f %f "&p1,&p2,&p3,&p4,&p5,&p6);

, это занимает много времени.

Любое предложение читать с большей скоростью?Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 04 марта 2011

Считайте их в строковый буфер, затем проанализируйте строку - если вы настаиваете на использовании 'c', смотрите fgets () и sscanf ()

1 голос
/ 04 марта 2011

Попробуйте использовать boost.spirit .

1 голос
/ 04 марта 2011

Вы должны использовать fstream.Создайте объект fstream in, например, fin, и затем введите данные в файл так же, как при использовании cin.Вы можете использовать библиотеку iomanip для лучшего форматирования.

0 голосов
/ 04 марта 2011

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

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

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

PS: Поскольку вы используете fscanf (), я предполагаю, что вы можете искать решение в стиле C вместо стандартных библиотек C ++, таких как fstream и stringstream.Извините, я не могу дать вам намека на то, что желание придерживаться функций C - это проблема, которую я преодолел давным-давно, и, надеюсь, вы уже сделали это или сделаете это в ближайшее время.

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