|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Пересобрать двухмерный массив в массив записей
Есть большой файл (131Мб) содержащий данные 2x4 байт. Для удобства его можно представить как record длиной более 32млн записей.
Код:
TRec = record A,B: integer; end; : Я планирую создать новый тип записи вида Код:
TNewRec = packed record B:integer; Count:byte; A: array of integer; end; Другого метода в голову пока не приходит. Но к сожалению и с этим-то я пока не могу разобраться. Получается, если на 1 проход для поиска всех совпадений затрачено 1,5 минуты, то по сути положение основного курсора (место очередного значения В) в потоке будет смещаться слишком медленно. На калькуляторе это выдало более 25млн минут и экспонента времени ближе к концу тут не особо поможет. Как же мне преобразовать этот файл? Вернее задача даже заключается в том как уменьшить исходный файл и сократить в нём время поиска? Последний раз редактировалось Motorolla, 25.07.2021 в 20:29. |
#2
|
|||
|
|||
В общем, идея праильная.
Вариант. Читаем файл и перекодируем его в вид: <Bi - {Am,An,...}> Т.е. Map с ключем B и заначением в виде списка A. Т.о, получаем практически мгновенный поиск по B (за счет внутреннего механизма Map). Ну и сохранять можно точно так же. Но в этом случае поиск по A будет практически невозможным. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Motorolla (26.07.2021)
|
#3
|
|||
|
|||
Спасибо! Осталось разобраться как создаются и обрабатываются эти мар файлы. Пока тёмный лес...
|
#4
|
|||
|
|||
Map - это не файл. Это программный контейнер. Как ты его сохранишь в файл (и как будешь читать потом) - это уже твое дело. Можно, например, сохранять в бинарный файл.
Пусть не будем использовать стандарный контейнер, а используем "самописный": Код:
type TMapItem = record B : Integer; As : Array Of Integer end; var dataFile : Array Of TMapItem; procedure SaveMap(AFileName : String) var Stream : TFileStream; C, I, J : Integer; begin Stream := TFileStream.Create(AFileName,foCreate); Try C := Length(dataFile); Stream.WriteBuffer(C,sizeOf(Integer); For I := Low(dataFile) To High(dataFile) Do Begin Stream.WriteBuffer(dataFile[i].B,SizeOf(Integer)); C := Length(dataFile[i].As); Stream.WriteBuffer(C,SizeOf(Integer)); For J := Low(dataFile[i].As) To High(dataFile[i].As) Do Stream.WriteBuffer(dataFile[i].As[J],SizeOf(Integer)); End; Finally Stream.Free; End; end; Принцип записи массивв - сначала пишем кол-во элементов, потом сами элементы. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Motorolla (27.07.2021)
|
#5
|
|||
|
|||
Да, мал помалу стало понятно как работать с map и что это вообще такое, хотя не просто найти внятное описание с примерами. С сохранением как раз вопрос в воздухе и витал. Теперь тот же поиск всех столкновений составил 350mS!!!
Спасибо ещё раз за помощь! Последний раз редактировалось Motorolla, 27.07.2021 в 23:12. |
#6
|
|||
|
|||
А в Map не поиск. Там доступ по вычисляемому ключу
Ну типа как вычислить хэш от ключевого поля и использовать его как индекс в массиве. Это грубо, но поясняет принцип. |