Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > индексация


Автор: stab 21.10.2007, 22:49
Существует ли в природе библиотеки для индексации любых данных без привязки к БД? Например для ведения индекса по файлам, в псевдокоде что-то вроде:

Код

TImageFileInfo = class
    property Path: String; // key
    property ImageWidth: Integer;
    property ImageHeight: Integer;
    property Comments: String; // from exif or jpeg comment block
end;

...

imageInfo := TImageFileInfo.Create("c:\image.jpg");
IndexingService.AddToIndex(imageInfo);

...

images: array of string;
images := IndexingService.FullTextSearch(TImageFileInfo, "Comments", "apples");

...

images := IndexingService.SelectLessOrEqual(TImageFileInfo, "ImageWidth", 1024);
images := IndexingService.SelectLessOrEqual(TImageFileInfo, "ImageHeight", 768, images);


Т.е. хранения данных не нужно, они уже храняться в самих файлах, нужна только возможность поддержания индекса по ним.

Автор: Alix 22.10.2007, 11:10
вместо TImageFileInfo наверное можно использовать TStrings, т.к. там можно хранить пары "ключ=значение" (разделитель можно изменить) и брать их по TStrings.Values[key]. Таким образом у тебя будет:
  • функция, parseImage, которая принимает на вход имя файла а на выход дает TStrings свойств картинки
  • затем мы просто добавляем этот результат в некий index : TStringList, который будет хранить пару имя файла - объект TStrings со свойствами файла, этот index будет Sorted := true (в общем то и св-ва файла можно делать Sorted если их будет много)
  • делаем все необходимые тебе функции как показанная SelectLessOrEqual
Как оно могло бы выглядеть:
Код
// returns index of image in indices array, starting from position pos or -1 if not found
function selectLessOrEqual(where : TStringList; key : string; value : integer; pos : integer = 0) : integer;
begin
  for result := pos to where.count-1 do
    if strtoint((where.Objects[result] as TStrings).Values[key]) <= value then
      exit;

  result := -1;
end;


Автор: Alix 22.10.2007, 11:26
хотя не, логичнее все же хранить в index : TStringList пары имя свойства - значения. Т.е. делать так:
Код
type
  // для храния ссылки на массив имен файлов
  TImageIndex = class
    index : integer;
    constructor Create(value : integer);
  end;

// при добавлении еще одного объекта:
if index.find('width', ix) then begin
  (index.objects[ix] as TStringList).addObject(inttostr(widthValue), TImageIndex.Create(imageIndex));
end else begin 
  sl := TStringsList.Create;
  sl.addObject(inttostr(widthValue), TImageIndex.Create(imageIndex));
  index.addObject('width', sl);
end;

// тогда эта функция будет:
function selectLessOrEqual(where : TStringList; key : string; value : integer; pos : integer = 0) : integer;
var
  ix : integer;

begin
  result := -1;
  if not where.find(key, ix) then
    exit;
  
  // жаль что TStringList не умеет сортировать в естественном для чисел порядке
  with (where.objects[ix] as TStringList) do
    for result := pos to count-1 do
      if inttostr(Strings[result]) <= value then
        exit;

  result := -1;
end;

ps: все это на коленке делано и только в окне браузера. За качество идеи тоже не ручаюсь, это просто то, что пришло в голову.

Автор: stab 24.10.2007, 00:56
т.е. надо строить велосипед. понятно )

Автор: Alix 24.10.2007, 08:20
возможно и не надо, но лично я готовых библиотек не знаю

Автор: MetalFan 24.10.2007, 09:22
если мне не изменяет память, был в свое время компонент в RxLib ... TMemoryTable чтоли... т.е. позволял подключаться к нему как к  таблице на диске... в общем поковыряй в эту сторону

Добавлено через 4 минуты и 23 секунды
во, в JVCL есть компонент TJvMemoryData

Автор: stab 24.10.2007, 14:38
MetalFan, за TJvMemoryData спасибо, это уже ближе к нужному функционалу, попытаюсь что-нибудь из этого выжать.

Alix, только без обид, но я же ведь не от хорошей жизни ищу такие библиотеки. объём данных достиг критического размера и простой перебор при поиске значений стал узким местом. поэтому и потребовался именно индекс по данным, но без пенальти за использование внешних таблиц и SQL.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)