Re: хранилище строк
От: jazzer Россия Skype: enerjazzer
Дата: 30.09.14 11:08
Оценка: +1
Здравствуйте, IROV.., Вы писали:

IRO>родилась такая идея сделать хранилище для строк

IRO>я думаю уже кто-то решал и думал над этим, есть идеи?

Даже решения есть, не то что идеи:
http://www.boost.org/libs/flyweight/
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: хранилище строк
От: smeeld  
Дата: 30.09.14 11:10
Оценка: -1
Здравствуйте, IROV.., Вы писали:


IRO>а по сути?


Тут думают над распределёнными хранилищами данных для хранения петабайт инфы,
чтоб породить что-то конкурентноспособное и денег срубить, а Вы про какие-то
строчки вспомнили, как первокурсник.
хранилище строк
От: IROV..  
Дата: 30.09.14 10:50
Оценка:
родилась такая идея сделать хранилище для строк,

интерфейс примерно такой

unsigned int addString( const char * str, size_t len ); //ID одинаковый для одинаковых str
void removeString( unsigned int id );
const char * toString( unsigned int id );

важно что бы имело минимальный размер в памяти, ну и добавлять/удалять строки можно рантайм

я думаю уже кто-то решал и думал над этим, есть идеи?

З.Ы. была идея хранить на HDD
я не волшебник, я только учусь!
Re: хранилище строк
От: smeeld  
Дата: 30.09.14 10:55
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>родилась такая идея сделать хранилище для строк,


IRO>интерфейс примерно такой


На каком курсе учитесь?
Re[2]: хранилище строк
От: IROV..  
Дата: 30.09.14 11:06
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, IROV.., Вы писали:


IRO>>родилась такая идея сделать хранилище для строк,


IRO>>интерфейс примерно такой


S>На каком курсе учитесь?

  отучился
10 лет опыта работы, куча выпущенных проектов, начиная от казуальных, заканчивая серверами для ММО, а чё?

а по сути?
я не волшебник, я только учусь!
Re: хранилище строк
От: Zhendos  
Дата: 30.09.14 11:18
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>родилась такая идея сделать хранилище для строк,


IRO>интерфейс примерно такой


IRO>unsigned int addString( const char * str, size_t len ); //ID одинаковый для одинаковых str

IRO>void removeString( unsigned int id );
IRO>const char * toString( unsigned int id );

IRO>важно что бы имело минимальный размер в памяти, ну и добавлять/удалять строки можно рантайм


IRO>я думаю уже кто-то решал и думал над этим, есть идеи?


IRO>З.Ы. была идея хранить на HDD


а зачем?

строковые константы и так будут иметь одинаковый
адрес в случае использования связки современный компилятор/линковщик.
Значит остается только случай генерируемых на лету строк,
но для них можно взять класс строк, такой чтобы
MyString s;
s += "a";
s += "b";
//...
MyString s2 = s;//(1)


после (1) эти два объекта s и s2 содержали указатель на одну и ту же
область памяти.
Re[4]: хранилище строк
От: IROV..  
Дата: 30.09.14 11:23
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, IROV.., Вы писали:



IRO>>а по сути?


S>Тут думают над распределёнными хранилищами данных для хранения петабайт инфы,

S>чтоб породить что-то конкурентноспособное и денег срубить, а Вы про какие-то
S>строчки вспомнили, как первокурсник.
А у меня всего на всего нужно влезть в 70мг памяти, и как мне кажется мои строки жрут много.
и все же
я не волшебник, я только учусь!
Re[2]: хранилище строк
От: IROV..  
Дата: 30.09.14 11:30
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, IROV.., Вы писали:


IRO>>родилась такая идея сделать хранилище для строк

IRO>>я думаю уже кто-то решал и думал над этим, есть идеи?

J>Даже решения есть, не то что идеи:

J>http://www.boost.org/libs/flyweight/

а разве это не просто намаханый контейнер для хранению данных с хешированием?
Памяти то меньше не станет?
Мне кажется строки особенно FilePath можно было бы не плохо с архивировать,
тут мне видится некое дерево, или архивация, или что-то еще.
я не волшебник, я только учусь!
Re[2]: хранилище строк
От: icWasya  
Дата: 30.09.14 11:30
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, IROV.., Вы писали:


IRO>>родилась такая идея сделать хранилище для строк,


IRO>>интерфейс примерно такой


IRO>>unsigned int addString( const char * str, size_t len ); //ID одинаковый для одинаковых str

IRO>>void removeString( unsigned int id );
IRO>>const char * toString( unsigned int id );
...
Z>а зачем?

...
Человеку скорее всего нужно, что бы после
 
int a = addString("a",1);
int b = addString("b",1);


переменные a и b содержали значения, не зависимые от запуска к запуску.
Re: хранилище строк
От: Stanislav V. Zudin Россия  
Дата: 30.09.14 11:31
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>родилась такая идея сделать хранилище для строк,


IRO>интерфейс примерно такой


IRO>unsigned int addString( const char * str, size_t len ); //ID одинаковый для одинаковых str

IRO>void removeString( unsigned int id );
IRO>const char * toString( unsigned int id );

IRO>важно что бы имело минимальный размер в памяти, ну и добавлять/удалять строки можно рантайм


IRO>я думаю уже кто-то решал и думал над этим, есть идеи?


Решал.
Собственно хранение строк и доступ по индексу реализуются элементарно.
Берем два массива. В одном хранятся строки подряд, в другом — индексы "голов".

std::vector<int> Head;   // индекс первого символа строки
std::vector<char> Chars; // строки

Можно хранить с завершающим нулем (удобно для передачи в сишные функции), либо вычислять длину строки налету (а можно совместить):

length = Head(i+1) - Head(i); // Длина i-й строки

В последнем случае в массиве Head можно хранить дополнительный замыкающий элемент "сторож", чтобы не плодить if'ы в вычислениях.

Доступ к i-й строке выглядит так:
const char * toString( unsigned int id ) const
{
   return &Chars[Head[id]];
}


При вставке в середину или при изменении длины строки придется подвинуть все символы, расположенные правее и поправить индексы в Head. На первый взгляд кажется накладным, но на моих задачах это получается намного быстрее, чем использование традиционного vector<string> или каких-либо сложных страничных контейнеров.
Cache-friendly и всё такое..

IRO>"ID одинаковый для одинаковых str"

нужен хеш.

Считаем хеш, получаем индекс строки в массиве.
Хеш реализуется на двух массивах — в одном, собственно, хеш таблица — хранится индекс первого элемента в списке коллизии.
Во втором массиве (размер которого равен размеру массива Head) индекс следующего в списке коллизий, либо -1, если конец списка.

IRO>З.Ы. была идея хранить на HDD


Приведенная структура сериализуется очень задешево. Для каждого массива внутри контейнера записываются число элементов и собственно содержимое.
Т.е. получается всего 4 вызова write/read (для хеша — 8, добавляются еще два массива — хеш-таблица + список коллизий).


Да, если размер памяти критичен и число строк может уложиться в 32К, то "vector<int> Head" меняется на "vector<short> Head" и затраты по памяти уменьшаются вдвое

Добавлю...
У меня индекс в массиве — именованная сущность, поэтому отрицательные индексы нужны для обозначения невалидных объектов, либо для спец. значений.
Если можешь воспользоваться беззнаковыми типами, то "vector<unsigned short> Head" дает пространство для маневра.
_____________________
С уважением,
Stanislav V. Zudin
Отредактировано 30.09.2014 11:37 Stanislav V. Zudin . Предыдущая версия .
Re[2]: хранилище строк
От: IROV..  
Дата: 30.09.14 11:32
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, IROV.., Вы писали:


IRO>>родилась такая идея сделать хранилище для строк,


IRO>>интерфейс примерно такой


IRO>>unsigned int addString( const char * str, size_t len ); //ID одинаковый для одинаковых str

IRO>>void removeString( unsigned int id );
IRO>>const char * toString( unsigned int id );

IRO>>важно что бы имело минимальный размер в памяти, ну и добавлять/удалять строки можно рантайм


IRO>>я думаю уже кто-то решал и думал над этим, есть идеи?


IRO>>З.Ы. была идея хранить на HDD


Z>а зачем?


Z>строковые константы и так будут иметь одинаковый

Z>адрес в случае использования связки современный компилятор/линковщик.
Z>Значит остается только случай генерируемых на лету строк,
Z>но для них можно взять класс строк, такой чтобы
Z>
Z>MyString s;
Z>s += "a";
Z>s += "b";
Z>//...
Z>MyString s2 = s;//(1)
Z>


Z>после (1) эти два объекта s и s2 содержали указатель на одну и ту же

Z>область памяти.
это уже реализовано,
http://rsdn.ru/forum/cpp/3853558.1
Автор: IROV..
Дата: 23.06.10


да и это не решает проблему сжать данные
я не волшебник, я только учусь!
Re[3]: хранилище строк
От: Zhendos  
Дата: 30.09.14 11:51
Оценка:
Здравствуйте, IROV.., Вы писали:


Z>>после (1) эти два объекта s и s2 содержали указатель на одну и ту же

Z>>область памяти.
IRO>это уже реализовано,
IRO>http://rsdn.ru/forum/cpp/3853558.1
Автор: IROV..
Дата: 23.06.10


Это уже реализовано в Qt (QString),
и в std::string, который идет в составе gcc.

Скорее всего если покопаться, то для любой
современной платформы можно найти уже существующее.

Зачем еще один?

IRO>да и это не решает проблему сжать данные


ИМХО конечно, но если вам нужно еще и сжимать,
то это слишком специфичная задача,
и стоит описать ее в посте.

PS
Если речь идет о парсере какого-то языка,
то может стоит хранить смещение в файле и размер строки
и отображать файл в память.
Re[3]: хранилище строк
От: jazzer Россия Skype: enerjazzer
Дата: 30.09.14 11:56
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Здравствуйте, jazzer, Вы писали:


J>>Здравствуйте, IROV.., Вы писали:


IRO>>>родилась такая идея сделать хранилище для строк

IRO>>>я думаю уже кто-то решал и думал над этим, есть идеи?

J>>Даже решения есть, не то что идеи:

J>>http://www.boost.org/libs/flyweight/

IRO>а разве это не просто намаханый контейнер для хранению данных с хешированием?

IRO>Памяти то меньше не станет?

В смысле? У тебя в самой программе будет использоваться хэндл на строку, а не строка целиком.
Т.е. каждая уникальная строка будет храниться в единственном экземпляре.
Соответственно выигрыш появляется, если очень много одинаковых строк (авторы приводят в качестве примера всякие HTML, где одни и те же теги повторяются из раза в раз).
http://www.boost.org/doc/libs/1_56_0/libs/flyweight/doc/examples.html#example4

В общем, прочитай доки, они коротки и есть замеры производительности, в смысле памяти в том числе.
http://www.boost.org/doc/libs/1_56_0/libs/flyweight/doc/performance.html

IRO>Мне кажется строки особенно FilePath можно было бы не плохо с архивировать,

IRO>тут мне видится некое дерево, или архивация, или что-то еще.

В каком смысле архивировать? lza? Или prefix tree (для FilePath должно хорошо работать, по идее)?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: хранилище строк
От: Zhendos  
Дата: 30.09.14 11:59
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>PS

Z>Если речь идет о парсере какого-то языка,
Z>то может стоит хранить смещение в файле и размер строки
Z>и отображать файл в память.

Имеется ввиду что-нибудь типа:
struct MyString {
   static char *file_map_addr;
   off_t offset;
   size_t length;
};
Re[3]: хранилище строк
От: Evgeny.Panasyuk Россия  
Дата: 30.09.14 12:02
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Мне кажется строки особенно FilePath можно было бы не плохо с архивировать,

IRO>тут мне видится некое дерево, или архивация, или что-то еще.

Что известно о данных? Какая евристика? Много совпадающих префиксов?
Можно использовать что-то типа Trie, где доступ к конкретной строке осуществляется через лист дерева.
Re[5]: хранилище строк
От: IROV..  
Дата: 30.09.14 12:08
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, Zhendos, Вы писали:


Z>>PS

Z>>Если речь идет о парсере какого-то языка,
Z>>то может стоит хранить смещение в файле и размер строки
Z>>и отображать файл в память.

Z>Имеется ввиду что-нибудь типа:

Z>
Z>struct MyString {
Z>   static char *file_map_addr;
Z>   off_t offset;
Z>   size_t length;
Z>};
Z>

Это самое простое что приходит в голову, но боюсь с "отображать в файл" может быть проблемы с "кросс-платформ"
я не волшебник, я только учусь!
Re[4]: хранилище строк
От: IROV..  
Дата: 30.09.14 12:09
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, IROV.., Вы писали:


IRO>>Мне кажется строки особенно FilePath можно было бы не плохо с архивировать,

IRO>>тут мне видится некое дерево, или архивация, или что-то еще.

EP>Что известно о данных? Какая евристика? Много совпадающих префиксов?

EP>Можно использовать что-то типа Trie, где доступ к конкретной строке осуществляется через лист дерева.
EP>Image: 480px-Patricia_trie.svg.png
Все динамическое, за ранние ничего не известно — чаще всего это пути к файлам
я не волшебник, я только учусь!
Re[6]: хранилище строк
От: Zhendos  
Дата: 30.09.14 12:16
Оценка:
Здравствуйте, IROV.., Вы писали:

Z>>Имеется ввиду что-нибудь типа:

Z>>
Z>>struct MyString {
Z>>   static char *file_map_addr;
Z>>   off_t offset;
Z>>   size_t length;
Z>>};
Z>>

IRO>Это самое простое что приходит в голову, но боюсь с "отображать в файл" может быть проблемы с "кросс-платформ"

Какие проблемы, в POSIX и win32 есть отображение файла,
какие еще ОС вы хотите поддерживать?
Re[7]: хранилище строк
От: IROV..  
Дата: 30.09.14 12:33
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, IROV.., Вы писали:


Z>>>Имеется ввиду что-нибудь типа:

Z>>>
Z>>>struct MyString {
Z>>>   static char *file_map_addr;
Z>>>   off_t offset;
Z>>>   size_t length;
Z>>>};
Z>>>

IRO>>Это самое простое что приходит в голову, но боюсь с "отображать в файл" может быть проблемы с "кросс-платформ"

Z>Какие проблемы, в POSIX и win32 есть отображение файла,

Z>какие еще ОС вы хотите поддерживать?
https://www.madewithmarmalade.com/
например
я не волшебник, я только учусь!
Re: хранилище строк
От: Кодт Россия  
Дата: 30.09.14 12:36
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>важно что бы имело минимальный размер в памяти, ну и добавлять/удалять строки можно рантайм


Сколько строк в штуках, сколько строк в байтах, распределение по длине строк, требования по времени жизни указателей, скорость добавления-удаления, типичные сценарии добавления-удаления...
Опять же, требование уникального отображения строки на номер — это реальная потребность (например, для мгновенного сравнения строк), или пожелание (чтобы не тратить память на дубликаты).

В общем, формулируй техзадание. А заодно, расскажи о предметной области.


Про время жизни. Например.

Строки хранятся в жутко запакованном виде. И есть сравнительно небольшой кэш распакованных строк.
По запросу getString(i) — если нет в кэше, распаковываем, кэшируем. Выдаём указатель на элемент кэша.
Периодически чистим кэш, вызывая специальную функцию. (Чистить кэш в произвольный момент нельзя, т.к. строки у нас запоминаются как голые указатели, абсолютно неподконтрольные).
Если заменить голые указатели на умные, например, на shared_ptr, то можно сбрасывать элементы или страницы кэша по мере того, как нужда в них пропадает.
Перекуём баги на фичи!
Re: хранилище строк
От: Ops Россия  
Дата: 30.09.14 13:20
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>я думаю уже кто-то решал и думал над этим, есть идеи?


http://msdn.microsoft.com/en-us/library/windows/desktop/ms649056%28v=vs.85%29.aspx

Оно?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: хранилище строк
От: Pzz Россия https://github.com/alexpevzner
Дата: 30.09.14 13:46
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>родилась такая идея сделать хранилище для строк,


Тут не хватает слов про то, какова цель создания такого хранилища

IRO>unsigned int addString( const char * str, size_t len ); //ID одинаковый для одинаковых str

IRO>void removeString( unsigned int id );
IRO>const char * toString( unsigned int id );

Удобнее, если addString() возвращает const char*. Не обязательно такой же, какой ему дали. Но указывающий на строку с таким же содержимым.

Соответственно, removeString() получает в качестве параметра тоже const char*, а функция toString() становится не нужна.

IRO>З.Ы. была идея хранить на HDD


Сейчас уже даже редакторы текста берут весь текст целиком в память. Раньше умели подсасывать кусочками с, гм., ну оно и флоппиком могло быть, не обязательно HDD
Re[2]: хранилище строк
От: IROV..  
Дата: 30.09.14 15:53
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, IROV.., Вы писали:


IRO>>важно что бы имело минимальный размер в памяти, ну и добавлять/удалять строки можно рантайм


К>Сколько строк в штуках, сколько строк в байтах, распределение по длине строк, требования по времени жизни указателей, скорость добавления-удаления, типичные сценарии добавления-удаления...

К>Опять же, требование уникального отображения строки на номер — это реальная потребность (например, для мгновенного сравнения строк), или пожелание (чтобы не тратить память на дубликаты).

К>В общем, формулируй техзадание. А заодно, расскажи о предметной области.

Есть такая проблема, когда то давно я "тупанул" и сделал систему где FilePath и ResourceName это стринги
и теперь когда я 100+ сцен экспортчу из Photoshop+AfterEffect
У меня создается пару десятков тысяч строк, причем не маленькой длины

  пример
<DataBlock Name="01_FlowerbedZoom">
<Resource Name = "Movie01_FlowerbedZoom_Env_main" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "4533.33333333333"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Env_main_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 4533.33333333333"/>
<MovieLayer2D Name = "_Bg.png" Parent = "0" Index = "14" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/_Bg.png" Type = "Image" In = "0" Out = "4533.33333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "amulet.png" Parent = "0" Index = "13" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/amulet.png" Type = "Image" In = "0" Out = "4533.33333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Kristal_Particl" Parent = "0" Index = "12" Source = "Movie01_FlowerbedZoom_Kristal_Particl" Type = "Movie" In = "0" Out = "4533.33333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Roza_5" Parent = "0" Index = "11" Source = "Movie01_FlowerbedZoom_Roza_5" Type = "Movie" In = "0" Out = "466.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Roza_4" Parent = "0" Index = "10" Source = "Movie01_FlowerbedZoom_Roza_4" Type = "Movie" In = "0" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Roza_3" Parent = "0" Index = "9" Source = "Movie01_FlowerbedZoom_Roza_3" Type = "Movie" In = "0" Out = "666.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "22.png" Parent = "0" Index = "8" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1/22.png" Type = "Image" In = "0" Out = "4533.33333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Roza_2" Parent = "0" Index = "7" Source = "Movie01_FlowerbedZoom_Roza_2" Type = "Movie" In = "0" Out = "1000" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Roza_1" Parent = "0" Index = "6" Source = "Movie01_FlowerbedZoom_Roza_1" Type = "Movie" In = "0" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Trost_1" Parent = "0" Index = "5" Source = "Movie01_FlowerbedZoom_Trost_1" Type = "Movie" In = "0" Out = "566.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Trost_2" Parent = "0" Index = "4" Source = "Movie01_FlowerbedZoom_Trost_2" Type = "Movie" In = "0" Out = "533.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Trost_3" Parent = "0" Index = "3" Source = "Movie01_FlowerbedZoom_Trost_3" Type = "Movie" In = "0" Out = "533.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Trost4" Parent = "0" Index = "2" Source = "Movie01_FlowerbedZoom_Trost4" Type = "Movie" In = "0" Out = "566.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "Trost_5" Parent = "0" Index = "1" Source = "Movie01_FlowerbedZoom_Trost_5" Type = "Movie" In = "0" Out = "566.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/_Bg.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/_Bg.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/amulet.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/amulet.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1/22.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/1/22.png"/>
</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Kristal_Particl" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "4533.33333333333"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Kristal_Particl_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 4533.33333333333"/>
<MovieLayer2D Name = "Comp.flv" Parent = "0" Index = "4" Source = "MovieVideo_Movies/01_FlowerbedZoom/(Footage)/Comp.flv" Type = "Video" In = "0" Out = "4533.33333333333" StartInterval = "0" BlendingMode = "BlendingModeAdd" PlayCount = "2" Stretch = "0.6"/>
<MovieLayer2D Name = "spark[1-12].png" Parent = "0" Index = "3" Source = "MovieAnimation_Movies/01_FlowerbedZoom/(Footage)/spark/spark[1-12].png" Type = "Animation" In = "3900" Out = "4300" StartInterval = "0" BlendingMode = "BlendingModeAdd" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "spark[1-12].png" Parent = "0" Index = "2" Source = "MovieAnimation_Movies/01_FlowerbedZoom/(Footage)/spark/spark[1-12].png" Type = "Animation" In = "2133.33333333333" Out = "2533.33333333333" StartInterval = "0" BlendingMode = "BlendingModeAdd" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "spark[1-12].png" Parent = "0" Index = "1" Source = "MovieAnimation_Movies/01_FlowerbedZoom/(Footage)/spark/spark[1-12].png" Type = "Animation" In = "433.333333333333" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeAdd" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "MovieVideo_Movies/01_FlowerbedZoom/(Footage)/Comp.flv" Type = "ResourceVideo">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/Comp.flv" Alpha = "1" Codec ="ffmpegVideo" FrameRate = "16"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark1.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark1.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark2.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark2.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark3.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark3.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark4.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark4.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark5.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark5.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark6.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark6.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark7.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark7.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark8.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark8.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark9.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark9.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark10.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark10.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark11.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark11.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark12.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/spark/spark12.png"/>
</Resource>
<Resource Name = "MovieAnimation_Movies/01_FlowerbedZoom/(Footage)/spark/spark[1-12].png" Type = "ResourceAnimation">
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark1.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark2.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark3.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark4.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark5.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark6.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark7.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark8.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark9.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark10.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark11.png"/>
<Sequence Delay = "33.3333333333333" ResourceImageName = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/spark/spark12.png"/>

</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Roza_1" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "833.333333333333"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Roza_1_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 833.333333333333"/>
<MovieLayer2D Name = "19.png" Parent = "5" Index = "6" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/2/19.png" Type = "Image" In = "0" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "2.png" Parent = "0" Index = "5" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/2/2.png" Type = "Image" In = "0" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "18.png" Parent = "5" Index = "4" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/2/18.png" Type = "Image" In = "0" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "20.png" Parent = "5" Index = "3" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/2/20.png" Type = "Image" In = "0" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "21.png" Parent = "5" Index = "2" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/2/21.png" Type = "Image" In = "0" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "01_FlowerbedZoom.mp3" Parent = "0" Index = "1" Source = "MovieSound_Movies/01_FlowerbedZoom/(Footage)/01_FlowerbedZoom.mp3" Type = "Sound" In = "33.3333333333333" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/2/19.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/2/19.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/2/2.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/2/2.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/2/18.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/2/18.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/2/20.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/2/20.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/2/21.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/2/21.png"/>
</Resource>
<Resource Name = "MovieSound_Movies/01_FlowerbedZoom/(Footage)/01_FlowerbedZoom.mp3" Type = "ResourceSound">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/01_FlowerbedZoom.mp3" Codec = "oggSound" Converter ="ffmpegToOggSound"/>
<IsStreamable Value = "1"/>
</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Roza_2" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "1000"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Roza_2_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 1000"/>
<MovieLayer2D Name = "3.png" Parent = "0" Index = "5" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1/3.png" Type = "Image" In = "0" Out = "1000" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "22.png" Parent = "5" Index = "4" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1/22.png" Type = "Image" In = "0" Out = "1000" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "23.png" Parent = "5" Index = "3" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1/23.png" Type = "Image" In = "0" Out = "1000" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "24.png" Parent = "5" Index = "2" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1/24.png" Type = "Image" In = "0" Out = "1000" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "01_FlowerbedZoom.mp3" Parent = "0" Index = "1" Source = "MovieSound_Movies/01_FlowerbedZoom/(Footage)/01_FlowerbedZoom.mp3" Type = "Sound" In = "33.3333333333333" Out = "1000" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1/3.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/1/3.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1/23.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/1/23.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1/24.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/1/24.png"/>
</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Roza_3" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "666.666666666667"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Roza_3_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 666.666666666667"/>
<MovieLayer2D Name = "5.png" Parent = "0" Index = "9" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/5.png" Type = "Image" In = "0" Out = "666.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "11.png" Parent = "9" Index = "8" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/11.png" Type = "Image" In = "0" Out = "666.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "12.png" Parent = "9" Index = "7" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/12.png" Type = "Image" In = "0" Out = "666.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "13.png" Parent = "9" Index = "6" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/13.png" Type = "Image" In = "0" Out = "666.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "14.png" Parent = "9" Index = "5" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/14.png" Type = "Image" In = "0" Out = "666.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "15.png" Parent = "9" Index = "4" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/15.png" Type = "Image" In = "0" Out = "666.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "16.png" Parent = "9" Index = "3" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/16.png" Type = "Image" In = "0" Out = "666.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "17.png" Parent = "9" Index = "2" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/17.png" Type = "Image" In = "0" Out = "666.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "01_FlowerbedZoom.mp3" Parent = "0" Index = "1" Source = "MovieSound_Movies/01_FlowerbedZoom/(Footage)/01_FlowerbedZoom.mp3" Type = "Sound" In = "33.3333333333333" Out = "666.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/5.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/5/5.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/11.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/5/11.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/12.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/5/12.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/13.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/5/13.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/14.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/5/14.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/15.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/5/15.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/16.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/5/16.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/5/17.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/5/17.png"/>
</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Roza_4" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "833.333333333333"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Roza_4_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 833.333333333333"/>
<MovieLayer2D Name = "4.png" Parent = "0" Index = "4" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/4.png" Type = "Image" In = "0" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "42.png" Parent = "4" Index = "3" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/42.png" Type = "Image" In = "0" Out = "800" StartInterval = "0" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "41.png" Parent = "4" Index = "2" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/41.png" Type = "Image" In = "0" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "01_FlowerbedZoom.mp3" Parent = "0" Index = "1" Source = "MovieSound_Movies/01_FlowerbedZoom/(Footage)/01_FlowerbedZoom.mp3" Type = "Sound" In = "33.3333333333333" Out = "833.333333333333" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/4.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/4.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/42.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/42.png"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/41.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/41.png"/>
</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Roza_5" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "466.666666666667"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Roza_5_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 466.666666666667"/>
<MovieLayer2D Name = "1.png" Parent = "0" Index = "2" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1.png" Type = "Image" In = "0" Out = "466.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
<MovieLayer2D Name = "01_FlowerbedZoom.mp3" Parent = "0" Index = "1" Source = "MovieSound_Movies/01_FlowerbedZoom/(Footage)/01_FlowerbedZoom.mp3" Type = "Sound" In = "33.3333333333333" Out = "466.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/1.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/1.png"/>
</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Trost4" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "566.666666666667"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Trost4_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 566.666666666667"/>
<MovieCamera3D CameraPosition = "250; 250; -694.44444443" CameraInterest = "250; 250; 0" CameraFOV = "0.69111116117668" CameraAspect = "1" Width = "500" Height = "500"/>
<MovieLayer3D Name = "trost.png" Parent = "0" Index = "1" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/trost.png" Type = "Image" In = "0" Out = "566.666666666667" StartInterval = "2600" BlendingMode = "BlendingModeNormal" Shape = "1" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/trost.png" Type = "ResourceImageDefault">
<File Path = "Movies/01_FlowerbedZoom/(Footage)/trost.png"/>
</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Trost_1" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "566.666666666667"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Trost_1_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 566.666666666667"/>
<MovieCamera3D CameraPosition = "250; 250; -694.44444443" CameraInterest = "250; 250; 0" CameraFOV = "0.69111116117668" CameraAspect = "1" Width = "500" Height = "500"/>
<MovieLayer3D Name = "trost.png" Parent = "0" Index = "1" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/trost.png" Type = "Image" In = "0" Out = "566.666666666667" StartInterval = "0" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Trost_2" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "533.333333333333"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Trost_2_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 533.333333333333"/>
<MovieCamera3D CameraPosition = "250; 250; -694.44444443" CameraInterest = "250; 250; 0" CameraFOV = "0.69111116117668" CameraAspect = "1" Width = "500" Height = "500"/>
<MovieLayer3D Name = "trost.png" Parent = "0" Index = "1" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/trost.png" Type = "Image" In = "0" Out = "533.333333333333" StartInterval = "1166.66666666667" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Trost_3" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "533.333333333333"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Trost_3_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 533.333333333333"/>
<MovieCamera3D CameraPosition = "250; 250; -694.44444443" CameraInterest = "250; 250; 0" CameraFOV = "0.69111116117668" CameraAspect = "1" Width = "500" Height = "500"/>
<MovieLayer3D Name = "trost.png" Parent = "0" Index = "1" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/trost.png" Type = "Image" In = "0" Out = "533.333333333333" StartInterval = "2000" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
</Resource>
<Resource Name = "Movie01_FlowerbedZoom_Trost_5" Type = "ResourceMovie">
<Width Value = "500"/>
<Height Value = "500"/>
<FrameDuration Value = "33.3333333333333"/>
<Duration Value = "566.666666666667"/>
<KeyFramesPackPath Path = "Movies/01_FlowerbedZoom/Movie01_FlowerbedZoom_Trost_5_KeyFrames.xml" Converter = "xmlToAekMovie" />
<Loop Segment = "0 566.666666666667"/>
<MovieCamera3D CameraPosition = "250; 250; -694.44444443" CameraInterest = "250; 250; 0" CameraFOV = "0.69111116117668" CameraAspect = "1" Width = "500" Height = "500"/>
<MovieLayer3D Name = "trost.png" Parent = "0" Index = "1" Source = "MovieImage_Movies/01_FlowerbedZoom/(Footage)/trost.png" Type = "Image" In = "0" Out = "566.666666666667" StartInterval = "3233.33333333333" BlendingMode = "BlendingModeNormal" PlayCount = "1" Stretch = "1"/>
</Resource>
</DataBlock>


Как мы видим тут "туча" строк, но это только 1 файл.

Правильное решение это "переделать архитектуру"
Но я сейчас ищу "быстрый способ" что бы удовлетворить(сбить жар)
а дальше буду просить, скриптовщиков "переекспортить все"

да и как академический вопрос, тоже заинтерисовал.

Добавляем мы это естествено все динамично, строки все константы

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

К>Про время жизни. Например.

Большинство, всю жизнь.

К>Строки хранятся в жутко запакованном виде. И есть сравнительно небольшой кэш распакованных строк.

К>По запросу getString(i) — если нет в кэше, распаковываем, кэшируем. Выдаём указатель на элемент кэша.
К>Периодически чистим кэш, вызывая специальную функцию. (Чистить кэш в произвольный момент нельзя, т.к. строки у нас запоминаются как голые указатели, абсолютно неподконтрольные).
К>Если заменить голые указатели на умные, например, на shared_ptr, то можно сбрасывать элементы или страницы кэша по мере того, как нужда в них пропадает.
Вот я ищу "жутко запакованный вид", сейчас раздумываю над простой Database на HDD(самый минимум памяти, проблема беспокоить HDD придется на запись), по хешу сравниваю, и выдаю ID записи если новый(колизия).
Реальное представление строк, "посмотреть значение" мне по сути редко нужно, в основном для дебага.
я не волшебник, я только учусь!
Re[2]: хранилище строк
От: IROV..  
Дата: 30.09.14 15:59
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Здравствуйте, IROV.., Вы писали:


IRO>>я думаю уже кто-то решал и думал над этим, есть идеи?


Ops>http://msdn.microsoft.com/en-us/library/windows/desktop/ms649056%28v=vs.85%29.aspx


Ops>Оно?

Идея я думаю такая же, но это не просто крутая мапа которая дает ИД по стрингу, тут больше вопрос про хранение этой таблицы
я не волшебник, я только учусь!
Re: хранилище строк
От: Erop Россия  
Дата: 30.09.14 17:27
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>я думаю уже кто-то решал и думал над этим, есть идеи?


IRO>З.Ы. была идея хранить на HDD


Если строки, в основном, статические, то можно залудить такое представление, как отмапированный файл на дистке, где лежат подряд строки, при этом подстроки "включены" в более длинные.
Если терминированность строк не нужна, то можно и внутри длинных класть, иначе, прийдётся только в конец.
Если второе, то ко всей конструкции удобно привинтить индекс в форме постфиксного дерева.
Дальше собираем словарь статических строк, компилируем его в субоптимальную форму, и по нему шпарим.
Если строки не нашли, то дописываем в конец хранилища.
Да, id строки -- смещение в хранилище, а не идущие подряд числа.

Из дальнейших оптимизаций можно
1) Добавить в интерфейс возможность получать по старому id новый, и, тем самым освобождать короткие строки, если потом добавилась более длинная, заканчивающаяся на уже добавленную короткую.
Но если реально большинство строк статика, то есть новых мало, то это нафиг не понадобится.
2) Хранилище не мапировать, а пожать, и постранично читать по требованию в память. Это если место на диске/память под мапинг дороги.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: хранилище строк
От: IROV..  
Дата: 30.09.14 17:35
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, IROV.., Вы писали:


IRO>>я думаю уже кто-то решал и думал над этим, есть идеи?


IRO>>З.Ы. была идея хранить на HDD


E>Дальше собираем словарь статических строк, компилируем его в субоптимальную форму, и по нему шпарим.

E>Если строки не нашли, то дописываем в конец хранилища.
чем плох hash?

E>Да, id строки -- смещение в хранилище, а не идущие подряд числа.

Поспешное решение, если бы мне хватило только offset тогда да, но мне нужно будет
получить
offset
size
как минимум
ну я думаю ты понял о чем я
я не волшебник, я только учусь!
Re: хранилище строк
От: denisko http://sdeniskos.blogspot.com/
Дата: 30.09.14 17:44
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>родилась такая идея сделать хранилище для строк,


IRO>интерфейс примерно такой


IRO>unsigned int addString( const char * str, size_t len ); //ID одинаковый для одинаковых str

IRO>void removeString( unsigned int id );
IRO>const char * toString( unsigned int id );

IRO>важно что бы имело минимальный размер в памяти, ну и добавлять/удалять строки можно рантайм


Не думай о рантайме свысока. Точнее не все то рантайм, что реал тайм. У тебя куча заголовков общих (имена директорий), которые прекрасно жмуться чем-нибудь типа LZ. При этом тебе нужен только хранилище сжатых строк(жмешь при записи, распаковываешь при запросе) и небольшой кэш, где лежат расжатые строки. Для того, чтобы чекать, что текущий указатель на строку не выбросился из кеша, надо проверять его хеш при каждом запросе от пользователя. Т.е. код такой
struct StrWrapper
{
    const char* getStr() //голые строки не хранишь, только обертки
    {
        if(m_hash == getHash(m_currentPtr))
            return m_currentPtr;
        else
            m_storage->toString(id);
    }
};

Производительность просядет, но память поэкономишь.
<Подпись удалена модератором>
Re[3]: хранилище строк
От: denisko http://sdeniskos.blogspot.com/
Дата: 30.09.14 17:45
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>У меня создается пару десятков тысяч строк, причем не маленькой длины

Так а может тебе просто из текстовой сериализации в бинарную перегнать и с ней работать?
<Подпись удалена модератором>
Re[3]: хранилище строк
От: Erop Россия  
Дата: 30.09.14 18:38
Оценка:
Здравствуйте, IROV.., Вы писали:

E>>Если строки не нашли, то дописываем в конец хранилища.

IRO>чем плох hash?
Сложнее переиспользовать место. Если это не надо, то тогда вообще не ясно в чём проблема. Хранишь строки подряд + индекс люой природы, что бы коды получать.
Для статических строк индекс можно вообще CT получать тогда...

IRO>offset

IRO>size
IRO>как минимум
IRO>ну я думаю ты понял о чем я

Если чтрочка 0-терминированная в хранилище, то размер не нужен. Если нет, то размер из индекса достаёшь
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.