Паскалевские строки как раз ограничены и у Delphi тоже. Вопрос в том какой длины строки? Если как в примере около 4КБайт , то тут можно думать о дисковой оптимизации. А если больше 256 КБайт, то тут не стоит задумываться о том как писать или читать.
Ограничены разрядностью нулевого элемента (в Delphi отличается от разрядности остальных), который хранит длину строки и т.о. больше
символов в строку типа string не записать.(Кажется, в первых версиях Delphi были проблемы с очень длинными строками, и конечно же нужно свериться с руководством пользователя, прежде чем утверждать). При этом никто не мешает сделать собственный тип для строк длиннее
. В моей задаче строки могут быть разной длины. Средняя длина растет с ростом
нелинейно, а по меньшей мере квадратично. Выше я уже сказал, что цель насколько возможно увеличить
. Это и отвечает на вопрос, что строки могут быть очень длинными.
А вообще для сортировки наверно достаточно первых 1-8 байт строчек. Эти первые 1-8 скорее всего уникальные для строчки. Так что можно сформировать в отдельный файл.
Не тот случай: в моем случае строки могут полностью совпадать, т.о. при сравнении иногда придется сравнивать все символы. В Delphi, естественно, сравниваются символы до первого несовпадения.
Сваливаем всё в один файл последовательно. Плюс параллельно создаём индексный файл. Как в СУБД.
Если я правильно понял, Вы предлагаете писать в индексном файле позицию первого символа каждой строки, а также значения i,j (место элемента в матрице). Т.о. придется постоянно делать выход на нужную позицию файла данных. Диск конечно же не лента, но все же переспрошу: Вы уверены, что так будет быстрее, чем с кучей файлов?
Как я понял, вы преобразуете строки в числа
Нет. В модели я преобразовывал числа в строки. В реальной программе более сложная структура данных, которая в настоящий момент описывается дюжиной БНФ. Нет смысла их тут все приводить, приведу одну упрощенную формулу:
Код:
<элемент матрицы>::=<натуральное число>{<разделитель><натуральное число>}
При этом нужно несколько разделителей, например, ",",".","&", а еще и скобки "(",")" (приведенная формула скобки не учитывает), понятно, что речь идет о рекурсивной структуре данных. Про натуральные числа можно утверждать, что они в каждой строке принимают все значения от 0 до
. И тут возникает дополнительный вопрос: как лучше представить такую последовательность чисел с несколькими типами разделителей и скобками? В модели я пошел по самому примитивному пути - взял строки. Но правы те, кто указал, что такое представление не лучшее. Какое лучше на Ваш взгляд? Нужно только отметить, что по мере развития алгоритма приходится корректировать список разделителей и скобок, т.е. формат не полностью устоялся и хотелось бы выбрать достаточно гибкое представление, чтобы не переписывать много кода, если вдруг выяснится, что нужен еще один тип разделителя.
Про СУБД я серьезно задумался. Для СУБД моя задача выглядит слишком примитивной и большую часть возможностей СУБД она использовать не будет. Но и за неиспользованные возможности приходится платить, и вопрос в том, не окажется ли такая плата слишком высокой для производительности? Но наверное никто не сможет ответить мне на вопрос: что лучше в данном случае? сделать маленькое и специализированное или взять уже готовое, большое и универсальное? Придется пробовать: сделать и то и другое, и посмотреть, что будет работать быстрее. Технический вопрос: а есть ли в рекомендованных здесь СУБД ограничения на размер строки (или на вектор байтов)? Допускаются ли записи, размер которых меняется динамически во время выполнения? Насколько мне сейчас представляется,
каждая запись БД будет содержать три поля:
Код:
i,j:integer; // уникальные ключи
s: string; // или s: array of byte; ключ для сортировки