Форматы кеша, поддерживаемые программой

программа для загрузки и просмотра спутниковых снимков Земли, Луны, Марса предоставленных сервисами Google Maps и Космоснимки. Возможность работы с GPS приёмником.

Модератор: Tolik

zed
Гуру
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз
Поблагодарили: 568 раз

Re: Форматы кеша, поддерживаемые программой

Сообщение zed »

Нашел и уже пофиксил утечку в Беркли. Правда, была она там с самого начала времён. Изменения в репо пока не заливаю, т.к. переделываю формат кэша. А бага можете оформить для галочки.

Утечка была в функции TBerkeleyDB.Read, кому сильно мешает и невтерпёж, можете пофиксить сами:

Код: Выделить всё

function TBerkeleyDB.Read(
  AKey: Pointer;
  AKeySize: Cardinal;
  out AData: Pointer;
  out ADataSize: Cardinal
): Boolean;
var
  dbtKey, dbtData: DBT;
begin
  FCS.Acquire;
  try
    Result := False;
    if FDBEnabled then begin
      FillChar(dbtKey, Sizeof(DBT), 0);
      FillChar(dbtData, Sizeof(DBT), 0);
      dbtKey.data := AKey;
      dbtKey.size := AKeySize;
      if (FDB.open_flags and DB_THREAD = DB_THREAD) then begin
        dbtData.flags := DB_DBT_MALLOC;
      end;
      Result := CheckAndFoundBDB(FDB.get(FDB, nil, @dbtKey, @dbtData, 0));
      if Result and (dbtData.data <> nil) and (dbtData.size > 0) then begin
        ADataSize := dbtData.size;
        GetMem(AData, ADataSize);
        Move(dbtData.data^, AData^, dbtData.size);
//--fix
        FreeMem(dbtData.data);
        dbtData.data := nil;
        dbtData.size := 0;
//--fix
      end;
    end;
  finally
    FCS.Release;
  end;
end;
zed
Гуру
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз
Поблагодарили: 568 раз

Re: Форматы кеша, поддерживаемые программой

Сообщение zed »

vdemidov писал(а):
zed писал(а):Типа как в Яндексе - хэш Мортона? Т.е. сначала сделать swap, а потом хэш?
Насколько помню именно так. Только я бы сказал, что сначала хэш, а потом изменение порядка байт.
И видимо, в ключе нужно поменять местами X и Y. Т.е. изначально, у нас было(X,Y): $01000000 $00010000, мы сделали чередование - у нас получилось что-то вроде $01010000 $000000, далее делаем swap: $00000101 $000000, а теперь меняем местами X<->Y: $000000 $00000101. Вроде так?

Вот такие структуры у меня получаются:

Код: Выделить всё

 
const
  CBDBMetaVersion = #01;
  CBDBMetaMagic: array [0..3] of AnsiChar = ('M', 'I', 'D', CBDBMetaVersion);    //Meta Info Data

  CBDBMetaKeyX : Cardinal = $FFFFFFFF;
  CBDBMetaKeyY : Cardinal = $FFFFFFFF;

  CBDBRecVersion = #03;
  CBDBRecMagic: array [0..3] of AnsiChar = ('T', 'L', 'D', CBDBRecVersion);      //TiLe Data

type  
  PBDBKey = ^TBDBKey;
  TBDBKey = packed record
    TileY : Cardinal;
    TileX : Cardinal;
  end;

  PBDBData = ^TBDBData;
  TBDBData = record
    RecMagic  : array [0..3] of AnsiChar;
    RecCRC32  : Cardinal;
    TileSize  : Cardinal;
    TileDate  : TDateTime;
    TileVer   : PWideChar;
    TileMIME  : PWideChar;
    TileBody  : PByte;
  end;

  PBDBStorageMetaInfo = ^TBDBStorageMetaInfo;
  TBDBStorageMetaInfo = record
    MetaMagic     : array [0..3] of AnsiChar;
    MetaCRC32     : Cardinal;
    StorageEPSG   : Integer;
  end;
В обоих структурах я объединил Magic и Version, дабы не плодить лишних полей.

Структуру MetaInfo в процессе можно будет безболезненно изменять, а вот изменения в тайловых структурах критичны, поэтому прошу высказывать мысли по поводу того, что туда ещё обязательно нужно включить.
guf
Новичок
Сообщения: 33
Зарегистрирован: 10 авг 2011, 03:19
Благодарил (а): 15 раз
Поблагодарили: 6 раз

Re: Форматы кеша, поддерживаемые программой

Сообщение guf »

Tolik писал(а):
guf писал(а):полодил батник в папку с db_verify.exe
Надо положить в папку с картами - со всеми или только с одной. Проверяет файлы *.sdb во всех поддиректориях, начиная с текущей. Битые файлы переименовывает в *.sdb.BAD.

Кстати, для .tne надо тоже сделать.
Видимо для этого надо установить беркли на комп? Как я не шаманил, батник у меня не заработал. Да ну и черт с ним, сделать листинг файлов не проблема, сделать на его основе батник ""путь_до_db_verify.exe" "путь_до_файла"" по всему списку и выполнить в cmd ""путь_до_батника" > "путь_до_лога"" сложностей не вызвало :)
В общем промежуточный результат пока такой, проверено 804 файла беркли, найдено 3 ошибки (+1 ошибка была найдена и исправлена в момент конвертирования, итого 4 битых файла из 804 при конвертирвоании 23.5 мил тайлов). Версия программы создания была 4780. Все 4 ошибки возникли на тех файлах, где экспорт делался с 2-х файлов выделения в 1 файл базы. Я сейчас не скажу точно, делал ли я этот экспорт по очереди или паралельно, но так как проблемку нашел, среди проблемных файлов есть 1 файл размером в 178мб и на нем можно вполне комфортно проверить оба варианта и найти при каком вываливается такая ошибка с базой :)
zed, результат тестирования паралельной записи двумя потоками в 1 файл берки ведь интересен? Результат тут отписывать имеет смысл? И какой версией лучше пользоваться для этого? Есть ночная сборка 4780, есть отдельно exe, выложеный zedом выше в теме (с транзакциями) и могу скачать последнюю ночную сборку завтра. Скажи, какой лучше проверять, могу проверить всеми тремя - не проблема. Только у меня комп тут немного поломался, сейчас чиню :oops: , я прям сегодня сделать этого не смогу, сделаю спокойно завтра или послезавтра, а пока буду ждать ответов.
Молния - это вспышка от большого фотоаппарата, которым Google фотографирует Землю.
zed
Гуру
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз
Поблагодарили: 568 раз

Re: Форматы кеша, поддерживаемые программой

Сообщение zed »

Тестируйте на последней доступной ночной сборке.
vasketsov
Специалист
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Поблагодарили: 193 раза

Re: Форматы кеша, поддерживаемые программой

Сообщение vasketsov »

zed писал(а):В обоих структурах я объединил Magic и Version, дабы не плодить лишних полей
Потом не будет проблем, если захочется при отсутствии тайлов нужной версии (или при запросе тайла без версии) выдать предыдущую версию, тайл без версии или последнюю существующую версию тайла (речь о настройках хранилища)?
Впрочем тут я не советчик, во взрослых БД по возможности первичный ключ делается минимального размера, тут могут быть даже в этом свои тараканы.
Аватара пользователя
vdemidov
Гуру
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз
Поблагодарили: 157 раз

Re: Форматы кеша, поддерживаемые программой

Сообщение vdemidov »

Речь идет не о версии тайлов, а о версии хранилища. К версии тайлов отношения никакого не имеет.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
vasketsov
Специалист
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Поблагодарили: 193 раза

Re: Форматы кеша, поддерживаемые программой

Сообщение vasketsov »

Тогда какой смысл возвращать её каждый раз с каждым запрошенным тайлом?
Аватара пользователя
DJ VK
Гуру
Сообщения: 1468
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 80 раз
Поблагодарили: 314 раз

Re: Форматы кеша, поддерживаемые программой

Сообщение DJ VK »

Камрады, А как это хранилище переносить?
У меня не получается подключить новый квадрат, принесенный с другого компа без принесения с него env папки. (Кстати в некоторых папках логи уже по 10 мб уже не в 1м экземпляре. ) И очень похоже на то что старую можно удалять, а новая нужна обязательно, чтоб и то что было, и новое вместе смотреть.
Расскажите о сути папки транзакций env. Что в ней действительно нужно сохранять для совместисмости?
zed
Гуру
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз
Поблагодарили: 568 раз

Re: Форматы кеша, поддерживаемые программой

Сообщение zed »

DJ VK писал(а):Камрады, А как это хранилище переносить?
Надо выполнить 2 операции:
- экспорт из кэша №1 во временную папку
- импорт из временной папки в кэш №2
Если кэши 1 и 2 находятся на одном компьютере, то можно обойтись без временной папки, но я так понимаю, что это не тот случай.

Экспорт можно сделать САСом хоть сейчас, а вот с импортом загвоздка - такая операция отсутствует (но в хотелках где-то вроде записана), поэтому нужны сторонние средства. Готового ничего нет, но в процессе: http://sasgis.org/forum/viewtopic.php?f ... &start=160
DJ VK писал(а):Расскажите о сути папки транзакций env. Что в ней действительно нужно сохранять для совместисмости?
Могу сказать одно: до дальнейших указаний папку env руками не трогать - удаление файла лога, для текущей реализации кэша, смертельно. Как это победить я пока не придумал и буду признателен, если кто ткнёт носом.

P.S. Залил изменения с новой структурой записей в репо - завтра удаляем весь старый кэш и тестируем вновь-созданный.
zed
Гуру
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз
Поблагодарили: 568 раз

Re: Форматы кеша, поддерживаемые программой

Сообщение zed »

vasketsov писал(а):
zed писал(а):В обоих структурах я объединил Magic и Version, дабы не плодить лишних полей
Впрочем тут я не советчик, во взрослых БД по возможности первичный ключ делается минимального размера, тут могут быть даже в этом свои тараканы.
Тут первичный ключ = 8 байтам и это всего лишь X,Y тайла. Всё остальное - данные и на поиск конкретного тайла не влияют.
Ответить

Вернуться в «SAS.Планета»