Дано:
Текстовый файл, содержащий действительные числа, разделенные либо пробелами либо знаками табуляции (результаты расчета в стороннем научном ПО). Размер файла порядка 1 - 5 Гб.
Числовая информация разбита на строки, содержащие по нескольку чисел.
Задача:
Прочитать файл и получить массив array of double за максимально короткое время.
Идея решения:
1.Читается строка.
2. Ищутся позиции разделителей (пробел либо табуляция) предшествующего первому символу и следующего за последним символом числа. Подстрока, между разделителями и есть число, которое преобразуется в double с помощью val.
3. Действие 2 повторяется для всех чисел в строке.
4. Повторяются действия 1 - 3 пока не закончится массив чисел в файле.
Для ускорения поиска разделителей, на сколько я понял, нужно использовать указатель на char, как это сделано в быстрой версии функции Pos
Function Pos (c : Char; const s : AnsiString) : SizeInt;
В связи с задачей хотел бы получить ответ на следующий вопрос:
Получить подстроку строки можно функцией Copy(s, index, count). Правильно ли я понимаю, что при этом происходит физическое копирование подстроки во вновь выделенную область памяти? Если это так, то это не эффективно.
Можно ли придумать способ передать в процедуру Val подстроку строки без выделения памяти и копирования?
То есть хочется получить указатель на подобласть памяти строки s и именно ее и передавать в процедуру Val, что-то вроде
Val(pointerof(s,index,count), value, Err);