SASGIS - SAS.Планета
View Issue Details
0001200SAS.ПланетаРефакторингpublic04-03-2012 19:2331-07-2015 10:18
zed 
zed 
normalminoralways
resolvedfixed 
110418 
150915150915 
0001200: Добавить кэширование тайлов на уровне тайлохранилища
Нужно, что бы тайлохранилище держало в памяти небольшой кэш инфы о тайлах плюс сами тайлы в не распакованном виде.
No tags attached.
related to 0001168closed vdemidov Оптимизировать дисковые операции при работе с кэшем 
related to 0002708confirmed  Промежуточный кэш для оптимизации записи для медленных тайлохранилищ 
child of 0001255confirmed  Добавить режим "Интернет без записи в кэш".  
log Filemon.LOG (7,424) 04-03-2012 19:23
http://www.sasgis.org/mantis/file_download.php?file_id=676&type=bug
Issue History
04-03-2012 19:23zedNew Issue
04-03-2012 19:23zedFile Added: Filemon.LOG
04-03-2012 19:24zedRelationship addedrelated to 0001168
04-03-2012 20:22vdemidovNote Added: 0005799
04-03-2012 22:30vdemidovNote Added: 0005800
04-03-2012 23:22vasketsovNote Added: 0005801
05-03-2012 04:40vdemidovNote Added: 0005802
05-03-2012 06:30zedNote Added: 0005803
05-03-2012 07:46vasketsovNote Added: 0005804
05-03-2012 07:47vasketsovNote Edited: 0005804bug_revision_view_page.php?bugnote_id=5804#r2929
05-03-2012 07:50vdemidovNote Added: 0005805
05-03-2012 07:56vasketsovNote Added: 0005806
05-03-2012 08:01zedNote Added: 0005807
05-03-2012 08:17vdemidovNote Added: 0005808
05-03-2012 08:45vasketsovNote Added: 0005809
05-03-2012 08:48zedNote Added: 0005810
05-03-2012 08:48vasketsovNote Edited: 0005809bug_revision_view_page.php?bugnote_id=5809#r2931
05-03-2012 09:03vasketsovNote Added: 0005811
05-03-2012 09:04vasketsovNote Edited: 0005811bug_revision_view_page.php?bugnote_id=5811#r2933
06-03-2012 22:44vdemidovNote Added: 0005877
06-03-2012 22:45vdemidovNote Edited: 0005877bug_revision_view_page.php?bugnote_id=5877#r2983
07-03-2012 05:12vasketsovNote Added: 0005883
07-03-2012 05:28vasketsovNote Edited: 0005883bug_revision_view_page.php?bugnote_id=5883#r2988
07-03-2012 06:02vdemidovNote Added: 0005892
07-03-2012 06:07vasketsovNote Added: 0005893
07-03-2012 06:11vdemidovNote Added: 0005894
07-03-2012 06:14vdemidovNote Added: 0005895
07-03-2012 06:15vdemidovNote Added: 0005896
07-03-2012 06:19vdemidovAssigned To => vdemidov
07-03-2012 06:19vdemidovStatusnew => confirmed
07-03-2012 06:20vdemidovProduct Version.Nightly => 110418
07-03-2012 06:20vdemidovTarget Version => 120808
07-03-2012 06:41vasketsovNote Added: 0005897
07-03-2012 07:17vdemidovNote Added: 0005898
07-03-2012 07:40vasketsovNote Added: 0005899
07-03-2012 08:10vdemidovNote Added: 0005900
07-03-2012 09:06vasketsovNote Added: 0005902
07-03-2012 09:43vdemidovNote Added: 0005903
07-03-2012 09:55vasketsovNote Added: 0005904
07-03-2012 10:31vdemidovNote Added: 0005906
07-03-2012 10:33vasketsovNote Added: 0005907
07-03-2012 10:34vasketsovNote Edited: 0005907bug_revision_view_page.php?bugnote_id=5907#r2992
07-03-2012 10:54vdemidovNote Added: 0005908
07-03-2012 10:54vdemidovNote Edited: 0005908bug_revision_view_page.php?bugnote_id=5908#r2994
07-03-2012 12:25vasketsovNote Added: 0005916
18-03-2012 19:18vasketsovNote Added: 0006191
18-03-2012 21:07vdemidovNote Added: 0006192
18-03-2012 21:35vasketsovNote Added: 0006196
18-03-2012 21:40vasketsovNote Edited: 0006196bug_revision_view_page.php?bugnote_id=6196#r3081
18-03-2012 21:46vasketsovNote Edited: 0006196bug_revision_view_page.php?bugnote_id=6196#r3082
12-04-2012 19:53zedNote Added: 0006422
12-04-2012 20:14vdemidovNote Added: 0006423
12-04-2012 20:44zedNote Added: 0006424
12-04-2012 21:03vdemidovNote Added: 0006425
03-06-2012 19:27zedNote Added: 0007304
03-06-2012 20:54Dima2000Note Added: 0007306
03-06-2012 20:57zedNote Added: 0007307
03-06-2012 22:24Dima2000Note Added: 0007308
19-06-2012 05:17vdemidovAssigned Tovdemidov =>
19-06-2012 05:17vdemidovSummaryЛишняя проверка FileExists при отображении тайлов из кэша => Добавить кэширование тайлов на уровне тайлохранилища
19-06-2012 05:17vdemidovDescription Updatedbug_revision_view_page.php?rev_id=3677#r3677
19-06-2012 05:17vdemidovSteps to Reproduce Updatedbug_revision_view_page.php?rev_id=3679#r3679
03-07-2012 05:13vdemidovNote Added: 0007749
07-08-2012 14:59vdemidovTarget Version120808 => 121010
10-10-2012 10:25vdemidovTarget Version121010 => 131111
07-05-2013 13:36vdemidovTarget Version131111 => 24xxxx
13-02-2014 16:54zedRelationship addedchild of 0001255
17-02-2015 09:52zedStatusconfirmed => resolved
17-02-2015 09:52zedFixed in Version => 150915
17-02-2015 09:52zedResolutionopen => fixed
17-02-2015 09:52zedAssigned To => zed
17-02-2015 09:53zedTarget Version24xxxx => 150915
31-07-2015 10:18vdemidovRelationship addedrelated to 0002708

Notes
(0005799)
vdemidov   
04-03-2012 20:22   
Это он лезет не для отображения, а для закачки. Поставь режим "Только кэш" и проверь.
(0005800)
vdemidov   
04-03-2012 22:30   
В общем нужно просто вводить еще один уровень кэширования внутри тайлохранилищ. Что бы кэшировались в памяти не уже распакованные битмапки и векторы, а исходные бинарные тайлы и инфа о них. И ограничение в этих кэшах ставить не по штукам тайлов, а по объему используемой памяти.
(0005801)
vasketsov   
04-03-2012 23:22   
Тогда скорость отображения тайлов ещё больше просядет.
(0005802)
vdemidov   
05-03-2012 04:40   
С какого перепугу она просядет?
(0005803)
zed   
05-03-2012 06:30   
>Поставь режим "Только кэш" и проверь.
Да, в этом режиме лишних телодвижений нет.
(0005804)
vasketsov   
05-03-2012 07:46   
(edited on: 05-03-2012 07:47)
Потому что:
а) при показе их надо будет распаковывать, гуляя по закэшированному месту, много и много раз (добавь к этому наложенные слои).
б) вычисление общего размера супротив просто количества - ещё одна дополнительная Interlocked-сущность под примитивом синхронизации.

(0005805)
vdemidov   
05-03-2012 07:50   
>а) при показе их надо будет распаковывать, гуляя по закэшированному месту, много и много раз (добавь к этому наложенные слои).
Это тут при чем? Я ж не предлагаю убирать старое кэширование готовых битмапок.
Я предлагаю добавить (и добавлю рано или поздно) еще одно.
>б) вычисление общего размера супротив просто количества - ещё одна дополнительная Interlocked-сущность под примитивом синхронизации.
По сравнению со временем обращения к диску Interlocked операция бесплатна.
(0005806)
vasketsov   
05-03-2012 07:56   
Хм. А как понимать
>Что бы кэшировались в памяти не уже распакованные битмапки и векторы
?

Будешь кэшировать один жпег с диска дважды (как файл и как распакованный битмап)?

Так кэш ФС будет делать это в третий раз. Он тоже будет кэшировать этот файл как файл. То, что в файлмоне показано обращение за файлом, означает лишь то что запрос испустился в ядро. Там запрос может запросто просто вернуться прямо из диспетчера кэша сразу взад. Экономишь переключение в режим ядра созданием своего кэша в пользовательском режиме дополнительно к уже существующему в ядре?
(0005807)
zed   
05-03-2012 08:01   
>Я предлагаю добавить (и добавлю рано или поздно) еще одно.
А нельзя просто заюзать старое? Качалке ж как таковой тайл нафиг не нужен, ей достаточно знать "есть/нету".
(0005808)
vdemidov   
05-03-2012 08:17   
>Хм. А как понимать
Это нужно понимать как "В общем нужно просто вводить еще один уровень кэширования внутри тайлохранилищ."

>Так кэш ФС будет делать это в третий раз. Он тоже будет кэшировать этот файл как >файл. То, что в файлмоне показано обращение за файлом, означает лишь то что >запрос испустился в ядро. Там запрос может запросто просто вернуться прямо из >диспетчера кэша сразу взад. Экономишь переключение в режим ядра созданием своего >кэша в пользовательском режиме дополнительно к уже существующему в ядре?
Тога какие проблемы в проверке наличия тайла и получении его даты? Оно ж уже в кэше ФС закэешировалось. Тогда весь этот инцидент можно закрывать как ненужный.
(0005809)
vasketsov   
05-03-2012 08:45   
(edited on: 05-03-2012 08:48)
>Тога какие проблемы в проверке наличия тайла и получении его даты?
Наличие файла и даты "кэш" получает из "папкиных" метаданных. Которые тоже кэшируются. Так что тут тоже просто по обращению нельзя сказать, полез ли "кэш" на диск.

>Оно ж уже в кэше ФС закэешировалось.
Возможно.

>инцидент можно закрывать как ненужный
Не сказал бы. Что именно нужно качалке? Если Size и Date от файла - ну так тогда их и надо добавить в существующий кэш.

Правда есть ещё один косячок. Кэш в памяти должен работать не по карте (строго один на карту), а по уникальным NameInCache (если 2 zmp настроены на одну папку - причин может быть куча, например разные урлы с разных "каналов" - должен быть один кэш)*. Но это сюда только косвенно относится (так как просто кэш в памяти дублируется).
----------------
*) Точнее даже не по NameInCache, а по уникальным парам "тип кэша" + "то что получается после совокупления BasePath из настроек кэшей и NameInCache".

(0005810)
zed   
05-03-2012 08:48   
Кэширование ФС вещь ненадёжная и непостоянная, и в разных версия винды и на разных типах носителей/источников кэша работает (или может работать) по-разному. К тому же, а как быть если кэш не в ФС, а в БД. Это ведь по-любому лишний запрос.
Так что, лучше всё и вся, насколько это возможно, кэшировать самостоятельно.
(0005811)
vasketsov   
05-03-2012 09:03   
(edited on: 05-03-2012 09:04)
>работает (или может работать) по-разному
Очевидно да.

>К тому же, а как быть если кэш не в ФС, а в БД
Ну пока очевидно точно также.

А вообще пример конечно "хороший", так как ни один клиент (в смысле клиентская либа API) "взрослых" СУБД очевидно не кэширует пользовательские данные на своей стороне, ибо с другого компа их могут в это время произвольно модифицировать.
В кавычках "хороший" не потому что он нехороший, а потому что слово не смог подобрать, чтобы просто обратить внимание на это. Даже если и кэшировать данные, при запросе придётся проверять некий timestamp модификации в СУБД. В общем конечно погрязнуть там можно здорово, но пока не факт что этог можно или нельзя избежать. Но по крайне мере очевидно, то без запросов в СУБД актуальный локальный кэш над СУБД не удержать. В этом смысле 2 одновременно запущенных саса из одной папки будут получать согласованные значения GetFileAttributesEx() вот прямо сейчас и бесплатно, а два саса над СУБД - фигушки даже с локальным кэшем без дополнительных запросов к СУБД.

А с СУБД кстати тоже ещё неизестно что дешевле выйдет. Размер кэша в памяти на сервере БД может быть и под кучу гигов. В этом смысле запрос по сетке будет быстрее, чем забацать умный локальный кэш, соваться в него (поднимая его из свопа), обламываться (ведь он же маленький по сравнению с кэшем в СУБД) и всё равно (пусть и не всегда) обращаться к СУБД. По крайней мере гигабитная сеть сравнима с винтами или даже быстрее их (по крайней мере с моими на ноуте или десктопе), так что тут ещё неизвестно как обернётся.

(0005877)
vdemidov   
06-03-2012 22:44   
(edited on: 06-03-2012 22:45)
Походу придется мириться с проверками FileExists не только в качалке, но и при отрисовке тайлов. Или делать кэширование хотя бы инфы о наличии тайлов на уровне тайлохранилища.
После добавления vasketsov версионности в кэш в памяти, карты с установленной версией и хранилищем не поддерживающим версионность (а такие все кроме GE) кэш в памяти просто перестает работать.

(0005883)
vasketsov   
07-03-2012 05:12   
(edited on: 07-03-2012 05:28)
>кэш в памяти просто перестает работать
Не понял почему перестаёт. Ведь коли карта без версии - считай там все тайлы под одной "пустой" версией. Просто частный случай. А "карты с установленной версией и хранилищем не поддерживающим версионность" вообще не понял.
Пусть сверху скажем для гугла спустилось "дайте тайл версии 105" - кэш в памяти сказал "есть такое, получите" - в хранилище не полезли. Если кэш сказал "нету, валите читать с харда" - прочитали с установили версию в настройках карты 105 и вернули тайл как 105-й версии (который уже и сохранили в кэш в памяти). Где косяк-то? Если версия установлена, а хранилище ещё не поддерживает - там на выходе и на выходе должны быть только тайлы этой версии Static. Тоже частный случай, только немного другого порядка. А при смене версии в настройках надо очищать кэш в памяти (я б всегда чистил).

>о наличии тайлов на уровне тайлохранилища
А сейчас наличие тайла в кэше в памяти не означает неявное подразумевание его существования в кэше на харде? Я правда видимо не догоняю суть проблемы... Мне показалось что если в кэш в памяти добавить размер и дату оригинального файла, то при закачке тайла хранилище сможет отвечать ими на вопрос "есть ли у нас уже тайл", и потом заодно определять, надо ли его перекачивать.

(0005892)
vdemidov   
07-03-2012 06:02   
>Если кэш сказал "нету, валите читать с харда" - прочитали
Но вернули пустую версию, так как в хранилище нет версионности. Сохранили в кэш с пустой версией. При следующей попытке чтения того же тайла все начинается сначала.
Из кэша результата никогда не будет.
(0005893)
vasketsov   
07-03-2012 06:07   
>Но вернули пустую версию
Не пустую, а указанную в настройках. Ровно ту же, которая, была запрошена.

В код сейчас я не глядел, но там версия как var должна передаваться, а не как out. Соответственно на входе Static, а если хранилище не поддерживает разные версии - оно её трогать вообще не должно - она же будет и на выходе из процы. Никто ж кроме хранилища не знает, поддерживает оно вот прямо сейчас версии или нет.
(0005894)
vdemidov   
07-03-2012 06:11   
>Не пустую, а указанную в настройках. Ровно ту же, которая, была запрошена.
Это будет неправильно. Например в берклидб информация о версии хранится, но не используется при поиске тайла. Так что ж ее просто терять вообще?
(0005895)
vdemidov   
07-03-2012 06:14   
Поэтому нужно делать так:
1. Запрос к тайлохранилищу о тайле.
2. Оно возрващает инфу о тайле в том числе реальную версию.
3. Если такой тайл вообще есть в хранилище, ищем в кэше готовых битмапок битмапку для тайла такой версии.
4. Если не нашли, то создаем и помещаем в кэш.
(0005896)
vdemidov   
07-03-2012 06:15   
Тоесть, нужно что бы тайлохранилище кэшировало в памяти инфу о тайлах. Скорее всего в этом кэше нужно ставить время жизни максимум пару минут, а еще лучше настраиваемое.
(0005897)
vasketsov   
07-03-2012 06:41   
>Например в берклидб
Ну как бы на то и пишутся _разные_ хранилища, чтобы само хранилище понимало, как версию парсить и что с ней делать.

>но не используется при поиске тайла
Может это какая-то другая версия, если её нельзя использовать в качестве версии при поиске тайла?

>Поэтому нужно делать так
Именно так и будет происходить, если хранилище, не поддерживающее версии (в смысле версий в настройках карты, а не в смысле каких-то других версий), не будет трогать переданную версию Static. Просто коли нет версий в хранилище, понятие "реальная версия" становится переопределимым как угодно. Можно с равным успехом считать в этом случае "реальной" как пустую версию (при этом будет ненужная процедура перехода от указанной версии к пустой версии), так и версию Static (которая, замечу, использовалась или будет использоваться при скачке тайла).
(0005898)
vdemidov   
07-03-2012 07:17   
Тайлохранилище не должно врать о версии тайла. И если не знает, должно возращать пустую версию.
(0005899)
vasketsov   
07-03-2012 07:40   
>И если не знает, должно возращать пустую версию
Возвращать оно должно ровно то, что туда положено, в том числе ту же версию.
Если при закладке тайла была версия V - он и должен вернуться с ТОЙ ЖЕ версией. Покуда в реальности у хранилища нет СВОЕЙ версии тайла - считай что хранилище доверило хранить версию самой карте и обещало её во всем слушаться.
(0005900)
vdemidov   
07-03-2012 08:10   
Это неправильно. Это ведет к потере информации.
(0005902)
vasketsov   
07-03-2012 09:06   
>Это ведет к потере информации
?
Невозможно потерять то, чего нет.
(0005903)
vdemidov   
07-03-2012 09:43   
Можно. Качаем в кэш берклидб, он сохраняет инфу о версии, но не ищет по ней. Экспортируем в любой кэш с поддержкой версии и вместо версии для тайлов получаем текущую выставленную версию.
(0005904)
vasketsov   
07-03-2012 09:55   
>он сохраняет инфу о версии
О какой версии? Откуда от её берёт и почему не ищет по ней?

>Экспортируем в любой кэш с поддержкой версии
Выше вроде обсуждалась ситуация, что кэш без версий?
(0005906)
vdemidov   
07-03-2012 10:31   
>О какой версии? Откуда от её берёт и почему не ищет по ней?
О той которая была установлена при закачке. Она сохраняется при сохранении в кэш скачанных файлов.
А не ищет по ней, потому что версия не входит в ключ, по которому идет поиск. Потому что так устроена текущая реализация кэша при помощи БерклиДб.
>Выше вроде обсуждалась ситуация, что кэш без версий?
Ну кэш в Беркли промежуточный вариант. И потом, ситуация же будет меняться.
(0005907)
vasketsov   
07-03-2012 10:33   
(edited on: 07-03-2012 10:34)
>версия не входит в ключ, по которому идет поиск
ну так значит надо сделать чтобы входила в ключ, во всех отношениях это будет правильнее, нельзя быть немножко версионным

(0005908)
vdemidov   
07-03-2012 10:54   
Зачем? Может мне просто нужно иметь инфу о версии тайла, но не нужно хранить все версии. Хватит последней скачанной.
Неправильно, это терять инфу в тех местах, где ее можно легко сохранить.

(0005916)
vasketsov   
07-03-2012 12:25   
>Может мне просто нужно иметь инфу о версии тайла, но не нужно хранить все версии
Тогда это не версионное хранилище, а обычное неверсионное, которое зачем-то сохраняет в качестве непонятного бонуса текущее значение параметра скачки, никакого отношения к _хранилищу_ не имеющего.

>Неправильно, это терять инфу
Неправильно обсуждать реализацию недоверсионного хранилища на языке версионного, а также вносить изменения в логику версионных и неверсионных хранилищ исходя из недоделанного недоверсионного. Версионное умеет выдавать разные тайлы на запросы разных версий - это основная суть версионности хранилища. Если в неверсионное хранилище надо сохранить некий бонус - так пусть это и называется "некий бонус", а не "версия тайла в хранилище".
(0006191)
vasketsov   
18-03-2012 19:18   
>Из кэша результата никогда не будет
Нечто похожее сейчас реализуется для GE и GC.
Покуда версию в настройках карты можно указать как 2011:11:11[History], а возвращаться будут тайлы с версией скажем 2011:11:11\88[History] - кэш в памяти фактически не работает для таких тайлов. А если указать в настройках карты полный формат 2011:11:11\88[History] - работает.
(0006192)
vdemidov   
18-03-2012 21:07   
Именно поэтому я и говорю, что к тайлохранилищу обязательно должно быть обращение как минимум за информацией о версии тайла актуальной для текущей настройки. А уже потом поиск распакованной картинки в кэше битмапок по конкретной версии. А уже тайлохранилище должно кэшировать такие вещи у себя.
(0006196)
vasketsov   
18-03-2012 21:35   
(edited on: 18-03-2012 21:46)
>к тайлохранилищу обязательно должно быть обращение как минимум за информацией о версии тайла актуальной для текущей настройки
По времени это будет просто убийство. Коли из хранилища вернулась инфа о версии тайла - так сразу и тайл доступен считай, версия всегда рядом лежит, а если ещё и искать надо по хранилищу....
Так что всё намного хитрее должно быть.
Вообще пора бы определиться, кэш в памяти кэширует запрошенную версию или отвеченную. Настоятельно предлагаю кэшировано запрошенную, это решит ровно все проблемы, кроме одной, которая называется "сменили версию в настройках карты - надо сбросить кэш" и это самая редкая проблема и наиболее просто решаемая просто очисткой кэша в памяти. Иначе придётся создавать кэш для ответов как функцию (x,y,z,v1) -> v2. Впрочем будет ещё проблема. Если к одной карте будут ходить с 2-мя разными версиями (одна для отображения, другая для параллельной скачки или экспорта), но до этого совсем далеко.
А так конечно можно вообще всё кэшировать, и обе версии (запрос и ответ), и tne и дату и размер).

(0006422)
zed   
12-04-2012 19:53   
О блин, ещё одну жесть увидел:
- кэш чистый
- включены карта и слой
- режим "интернет + кэш"
- при запуске SAS начинает загружать тайлы (всего в итоге загружено 95 тайлов)
- функция TileStorage.LoadTile вызвалась 7 тыс.(!) раз для карты и 11 тыс. (!) раз для слоя.

Это просто феерическое безобразие. Наблюдать его можно в обновлённом окошке DebugInfo.

Ноги растут из одного места или заводить новый баг?
(0006423)
vdemidov   
12-04-2012 20:14   
Ну вполне логично особенно если процессор быстрый, а инет медленный. Тайлов нет. Соответственно 95 раз в пустую. Плюс перед закачкой каждого тайла одна проверка на его наличие +95. И максимум полсе загрузки каждого тайла при старом способе рисования он пытается загрузить все 95. Итого 95*95+2*95=9215. Так что все правильно. Попробуй с новым основным слоем.
В секции [View]
UseNewMainLayer=1
(0006424)
zed   
12-04-2012 20:44   
>Попробуй с новым основным слоем.
Один фиг:

/MapType/Hike Bike/FileSystem/LoadTile 14553 0,00002879 00:00.419
/MapType/Hike Bike/FileSystem/SaveTile 86 0,00144456 00:00.124
(0006425)
vdemidov   
12-04-2012 21:03   
А. Ну да. Я забыл что еще не успел добавить выборочное обновление при изменении тайла. Но в любом случае кэширование на уровне тайлохранилища необходимо.
(0007304)
zed   
03-06-2012 19:27   
Сделал кэширование запросов GetTileInfo (см. https://bitbucket.org/azya/sasplanet/changeset/86f6fcc4e35c ).

По-идее, если тайл в кэше найден, то его инфу можно и не кэшировать (на уровне хранилища), поскольку эти запросы нагрузку особо создавать не должны. Основная нагрузка идёт от запросов на отсутствующий тайл, т.е. можно кэшировать только их, что в общем-то говоря, сильно уменьшит потребление памяти для дополнительного кэширования.
(0007306)
Dima2000   
03-06-2012 20:54   
Простите, может вопрос и глупый, но разве после New(VTile) не надо память освобождать в .Add?
И размер кэша ограничивается временем жизни, которое почти 50 дней?! Т.е. память он может отъедать будь здоров ...
И ещё, GetTickCount переполнится через 50 дней и проверка на TTL будет выдавать неправильный результат, ничего вроде бы страшного, но кэш будет затирать не старые ячейки, а произвольные. (Упс, у меня та же ошибка...)

А вообще здорово! Вот бы ещё такое же кэширование прикрутить к остальным хранилищам (и начать с u_TileStorageFileSystem.pas) ...
(0007307)
zed   
03-06-2012 20:57   
>после New(VTile) не надо память освобождать в .Add
Не надо. Память освобождается при удалении записи или очистке кэша.

>почти 50 дней?!
Неа - 30 секунд всего.
(0007308)
Dima2000   
03-06-2012 22:24   
Извиняюсь, вопрос глупый, увидел. И про размер и про 30с.
(0007749)
vdemidov   
03-07-2012 05:13   
Попробуй сейчас с новым слоем. Я сейчас, наконец, сделал частичное обновление экрана по изменению тайла. Так что если поменялся один тайл, то только один будет и обновляться, максимум 2 при изменении проекции.