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