Лучший способ разобрать большой файл с плавающей запятой, хранящийся в ASCII? - PullRequest
5 голосов
/ 04 августа 2010

Каков наилучший способ анализа большого файла с плавающей запятой, хранящегося в ASCII?

Какой самый быстрый способ сделать это? Я помню, как кто-то говорил мне, что ifstream был плохим, потому что он работал с небольшим количеством байтов, и было бы лучше сначала просто прочитать файл в память. Это правда?

Редактировать: я работаю в Windows, и формат файла предназначен для облака точек, которое хранится в таких строках, как x y z r g b. Я пытаюсь прочитать их в массивы. Кроме того, файлы имеют размер около 20 МБ каждый, но у меня их около 10 ГБ.

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

Ответы [ 3 ]

4 голосов
/ 04 августа 2010

Я думаю, что ваше первое беспокойство должно быть о том, насколько велики числа с плавающей запятой. Они плавают или могут быть двойные данные? Традиционный (C) способ - использовать fscanf со спецификатором формата для float, и на самом деле это довольно быстро. Iostreams добавляют небольшие накладные расходы с точки зрения анализа данных, но это довольно незначительно. Для краткости я бы предложил вам использовать iostreams (не говоря уже об обычных функциях потоковой передачи, которые вы получаете с ним).

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

1 голос
/ 04 августа 2010

Все это основано на операционной системе и выборе стандартных библиотек C и C ++.

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

atof / strtod может быть самым быстрым способом справиться с этим, если строка уже находится в памяти.

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

Если вам действительно нужнобыть смехотворно быстрым (единственные места, которые, я думаю, будет полезны, это подходы на основе HPC и Map / Reduce) - попробуйте mmap (Linux / Unix) или MapViewOfFile, чтобы получить файл, предварительно загруженный в виртуальную память, наиболее разумным способом, а затемatof + обработка пользовательских строк.

Если файл действительно хорошо организован для игр такого типа, вы даже можете быть хитрыми с mmaps и указателями и иметь многопоточное преобразование.Звучит как забавное упражнение, если у вас есть более 10 ГБ поплавков для преобразования на регулярной основе.

0 голосов
/ 04 августа 2010

Самый быстрый способ - использовать ifstream, но вы также можете использовать fscanf.Если у вас есть конкретная платформа, вы можете вручную загрузить файл в память и вручную извлечь из него число с плавающей точкой.

...