SASGIS

Веб-картография и навигация

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

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

Модератор: Tolik

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

Сообщение zed » 23 янв 2012, 01:04

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

Утечка была в функции 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 » 23 янв 2012, 01:21

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 в процессе можно будет безболезненно изменять, а вот изменения в тайловых структурах критичны, поэтому прошу высказывать мысли по поводу того, что туда ещё обязательно нужно включить.
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

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

Сообщение guf » 23 янв 2012, 17:04

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 фотографирует Землю.
guf
Новичок
 
Сообщения: 33
Зарегистрирован: 10 авг 2011, 03:19
Благодарил (а): 15 раз.
Поблагодарили: 6 раз.

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

Сообщение zed » 23 янв 2012, 18:13

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

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

Сообщение vasketsov » 24 янв 2012, 15:40

zed писал(а):В обоих структурах я объединил Magic и Version, дабы не плодить лишних полей

Потом не будет проблем, если захочется при отсутствии тайлов нужной версии (или при запросе тайла без версии) выдать предыдущую версию, тайл без версии или последнюю существующую версию тайла (речь о настройках хранилища)?
Впрочем тут я не советчик, во взрослых БД по возможности первичный ключ делается минимального размера, тут могут быть даже в этом свои тараканы.
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 198 раз.

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

Сообщение vdemidov » 24 янв 2012, 15:45

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

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

Сообщение vasketsov » 24 янв 2012, 16:08

Тогда какой смысл возвращать её каждый раз с каждым запрошенным тайлом?
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 198 раз.

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

Сообщение DJ VK » 24 янв 2012, 16:12

Камрады, А как это хранилище переносить?
У меня не получается подключить новый квадрат, принесенный с другого компа без принесения с него env папки. (Кстати в некоторых папках логи уже по 10 мб уже не в 1м экземпляре. ) И очень похоже на то что старую можно удалять, а новая нужна обязательно, чтоб и то что было, и новое вместе смотреть.
Расскажите о сути папки транзакций env. Что в ней действительно нужно сохранять для совместисмости?
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1468
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 323 раз.

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

Сообщение zed » 24 янв 2012, 20:34

DJ VK писал(а):Камрады, А как это хранилище переносить?

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

Экспорт можно сделать САСом хоть сейчас, а вот с импортом загвоздка - такая операция отсутствует (но в хотелках где-то вроде записана), поэтому нужны сторонние средства. Готового ничего нет, но в процессе: viewtopic.php?f=2&t=23&start=160

DJ VK писал(а):Расскажите о сути папки транзакций env. Что в ней действительно нужно сохранять для совместисмости?

Могу сказать одно: до дальнейших указаний папку env руками не трогать - удаление файла лога, для текущей реализации кэша, смертельно. Как это победить я пока не придумал и буду признателен, если кто ткнёт носом.

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

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

Сообщение zed » 24 янв 2012, 20:37

vasketsov писал(а):
zed писал(а):В обоих структурах я объединил Magic и Version, дабы не плодить лишних полей

Впрочем тут я не советчик, во взрослых БД по возможности первичный ключ делается минимального размера, тут могут быть даже в этом свои тараканы.

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

Пред.След.

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12