![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 не поиск. Там доступ по вычисляемому ключу
![]() Ну типа как вычислить хэш от ключевого поля и использовать его как индекс в массиве. Это грубо, но поясняет принцип. |