Поиск:

Ответ в темуСоздание новой темы Создание опроса
> индексация 
:(
    Опции темы
stab
Дата 21.10.2007, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



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

Код

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);


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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Alix
Дата 22.10.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: нет
Всего: 23



вместо 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;




--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Alix
Дата 22.10.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: нет
Всего: 23



хотя не, логичнее все же хранить в 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: все это на коленке делано и только в окне браузера. За качество идеи тоже не ручаюсь, это просто то, что пришло в голову.

Это сообщение отредактировал(а) Alix - 22.10.2007, 11:29


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
stab
Дата 24.10.2007, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



т.е. надо строить велосипед. понятно )


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Alix
Дата 24.10.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: нет
Всего: 23



возможно и не надо, но лично я готовых библиотек не знаю


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
MetalFan
Дата 24.10.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: нет
Всего: 128



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

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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
stab
Дата 24.10.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



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

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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0715 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.