Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.09.29;
Скачать: CL | DM;

Вниз

Проект "CachedBuffers"   Найти похожие ветки 

 
DevilDevil ©   (2013-03-12 15:51) [120]

> Rouse_ ©   (12.03.13 15:46) [117]
офтоп:
а зачем тебе кстати столько ?
вроде как объединение баз у вас не часто должно происходить
такой скорости наверное можно достичь если сжать все файлы в zip
и кстати если не сортировать в алфавитном порядке - тоже можно сэкономить время (ибо для хеш-поисков вообще не важен алфавитной порядок)


 
Павиа   (2013-03-12 15:52) [121]

Розыч. Опиши задачу словесно. Хочу попробовать одну штуку из области оптимизации.


 
DevilDevil ©   (2013-03-12 15:54) [122]

> brother ©   (12.03.13 15:44) [116]
> функция копирования большого файла при помощи этой байды
> будет быстрее стандартных примеров?


по тестам, которые я видел - ничего быстрее CopyFile и CopyFileEx не существует. Ибо там какие-то внутренние оптимизации используются

а если говорить о собственных поделиях... то хз. Медленнее работать не должно. Может быть для случаев копирования в рамках одного жёсткого диска нужно будет указать аргумент DoubleThreading false


 
Игорь Шевченко ©   (2013-03-12 15:54) [123]

Sapersky   (12.03.13 15:50) [119]

Нет, обертка вокруг стандартных вызовов API. Ее текст в какой-то ветке выложен. Если принципиально, могу на API написать то же самое, +10 строк кода :)


 
Rouse_ ©   (2013-03-12 15:55) [124]


> Павиа   (12.03.13 15:50) [118]
> Розыч. Опиши задачу совестно. Хочу попробовать в оптимизации
> одну штуку.

Сейчас не могу, я дома болею. В принципе все данные по задаче я Диме по асе пересылал, если он сможет их найти в хистори то думаю выложит.
Суть такая есть куски дампа наших баз в определенном формате, нужно их слить в один единственный файл убрав дубляж. Формат файлов есть у DevilDevil.
Мой вариант (который в примере) делает это все за 30 сек примерно, Дима реализовал слияние в районе 7 сек. Jack128 в качестве спортивного интереса сейчас пилит код в свободное время пытаясь выйти на необходимые для нас 4 секунды.
Данная задача решалась примерно два года назад и мы ее решили в Ega23, а этот вот пример остался просто как для разминки пальцев и мозга :)


 
DevilDevil ©   (2013-03-12 16:03) [125]

> Формат файлов есть у DevilDevil.
офтоп:
я так и не понял то описание, и хистори не осталось - комп сменили
я смотрел твои сорсы чтобы понять суть


 
Ega23 ©   (2013-03-12 16:06) [126]


> Если в твоей работе нет необходимости в высокопроизводительных
> приложениях, то что ты хочешь доказать мне ?

В высокопроизводительных - как раз есть. Мне не совсем понятна фишка зачитки таких гигантских кусков данных.
Да, у нас самый большой файл обновления весит 3,5 гига. Но это файл с определённой структурой, из которой "выдираются" нужные куски по-факту. А сами куски - не такие уж и огромные.
Как раз задница в обратном была: есть куча мелких файлов, но объединить это надо без дублирования (а дублирование там приличное, процентов 70). И когда 2 года назад экспериментировали, то на десятке больших файлов были вполне приемлемые результаты. Но когда выяснилось, что вместо десятка больших будет три сотни мелких - от тогда-то и приплыли.


 
DevilDevil ©   (2013-03-12 16:15) [127]

> Ega23 ©   (12.03.13 16:06) [126]
офтоп:
задачи у вас простые. всё сводится:
1) чтение/запись файлов
2) хеш-поиск
3) грамотный менеджмент памяти

ты вот попробуй много миллионов ячеек со своими стилями распарсить и производить с ними выборки, формулы, выгрузки... за 10 секунд - вот это действительно сложная задача


 
Ega23 ©   (2013-03-12 16:23) [128]


> Розыч. Опиши задачу словесно. Хочу попробовать одну штуку
> из области оптимизации.

Задача такова:
Есть информационная система, нечто похожее на Консультант. Т.е. множество различных документов (законы, стандарты, и т.д.).
Есть ежемесячные "обновления" данной системы (новые документы, поправки к старым). В данный момент полный комплект - около 300 обновлений с парой десятков тысяч документов.
В системе должен быть реализован быстрый поиск.
Соответственно, в каждом обновлении есть стрим со "словарём" для быстрого поиска. Формат словаря: сортированный список токенов, к каждому токену присобачен сортированный список ID документов, в которых данный токен встречается. Также дополнительным стримом лежит словарь токенов в LowerCase, к каждому токену присобачен список офсетов на case-sensetive токены.
Задача: из этих трёхсот стримов сформировать один, исключив дублирование токенов (дублирование, это когда токен "1" с вероятностью 99.99% встречается в каждом документе. А "ГОСТ13-43-4444" - скорее всего в нескольких).
Вроде так, если что - Розыч поправит. цифры тоже он помнит, сколько примерно эти стримы занимают, мне навскидку только процент повторяемости токенов в обновлениях (~70) помню.


 
Ega23 ©   (2013-03-12 16:25) [129]


> 2) хеш-поиск

Зачем? Там дихотомия, все словари отсортированы на этапе формирования обновления.


 
DevilDevil ©   (2013-03-12 16:26) [130]

>  мне навскидку только процент повторяемости токенов в обновлениях (~70) помню.
офтоп:
кстати вы там ошибку допустили при подсчёте повторений. на тех данных которые у меня были - дублирование составило около 50%


 
DevilDevil ©   (2013-03-12 16:30) [131]

> Ega23 ©   (12.03.13 16:25) [129]
> Зачем? Там дихотомия, все словари отсортированы на этапе
> формирования обновления.


мне конечно хочется вставить скриншот "facepalm"
но из уважения к розычу - отвечу
затем, что так быстрее минимум на порядок

дихотомия подойдёт для списка документов.
могу кстати поделиться быстрой поисковой функцией по дихотомии по инту, на ассемблере


 
Rouse_ ©   (2013-03-12 16:37) [132]


> DevilDevil ©   (12.03.13 16:26) [130]
> >  мне навскидку только процент повторяемости токенов в
> обновлениях (~70) помню.
> офтоп:
> кстати вы там ошибку допустили при подсчёте повторений.
> на тех данных которые у меня были - дублирование составило
> около 50%

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


 
Rouse_ ©   (2013-03-12 16:40) [133]


> Ega23 ©   (12.03.13 16:25) [129]
>
> > 2) хеш-поиск
>
> Зачем? Там дихотомия, все словари отсортированы на этапе
> формирования обновления.

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


 
Ega23 ©   (2013-03-12 16:45) [134]


> затем, что так быстрее минимум на порядок

Гм... С этого места по-подробнее, пожалуйста.


 
Ega23 ©   (2013-03-12 16:47) [135]


> Хэши самые быстрые, но мы по какой-то причине от них отказались

ЕМНИП, вопрос в хэш-функции был. Ну и на 2 мульёна токенов это при самом хреновом раскладе - 21 операция сравнения.


 
Rouse_ ©   (2013-03-12 16:58) [136]


> Ega23 ©   (12.03.13 16:47) [135]

Нюанс был не в скорость а в использовании, тыж помнишь там они у нас сами по себе в RAW хранятся и мы реально с данными в RAW режиме работаем (ну типа absolute)... где-то там был нюанс, впрочем уже не важно...


 
DevilDevil ©   (2013-03-12 16:58) [137]

> Ega23 ©   (12.03.13 16:45) [134]
>
> > затем, что так быстрее минимум на порядок
> Гм... С этого места по-подробнее, пожалуйста.


на 2 миллиона элементов дихотомия даёт 11 сравнений
в хеше всего парочка

но в вашем случае:
1) вы сравниваете между собой строки, а не числа, да ещё и вызывая дополнительную функцию - просадка по производительности
2) дихотомия постоянно обращается к разной памяти, что крайне плохо отражается на производительности за счёт кеш-мисс
3) вы используете String, а не PAnsiChar - просадка по выделению/удалению/копированию памяти, преобразования к Wide для Unicode-версий Delphi + оверхед по расходу памяти (пустоты в куче, длинна, счётчик ссылок, ...)


 
Rouse_ ©   (2013-03-12 17:09) [138]


> DevilDevil ©   (12.03.13 16:58) [137]
> 1) вы сравниваете между собой строки, а не числа, да ещё
> и вызывая дополнительную функцию - просадка по производительности
> 2) дихотомия постоянно обращается к разной памяти, что крайне
> плохо отражается на производительности за счёт кеш-мисс
> 3) вы используете String, а не PAnsiChar - просадка по выделению/удалению/копированию
> памяти, преобразования к Wide для Unicode-версий Delphi
> + оверхед по расходу памяти (пустоты в куче, длинна, счётчик
> ссылок, ...)

Во - первый грамотный анализ.
Ты собственно выделил три из пяти основных позиций с которыми мы и боролись.


 
DevilDevil ©   (2013-03-12 17:11) [139]

> Rouse_ ©   (12.03.13 17:09) [138]
офтоп:
четвёртый - это наверное "сложение" id-шников документов
а пятый - работа с файлами


 
Rouse_ ©   (2013-03-12 17:18) [140]

четвертый - оверхед токенов (перестраивали набор данных)
пятый - кэширование + быстрая работа с файловым кэшем


 
Ega23 ©   (2013-03-12 17:25) [141]


> на 2 миллиона элементов дихотомия даёт 11 сравнений

2^11=2048
Низачот


> вы сравниваете между собой строки, а не числа,

Ну это да, тут ничего не поделаешь. Но на самом деле это не настолько критично, проблемы только в нестрогом соответствии на коротких токенах.


> вы используете String, а не PAnsiChar

Не используем мы стринг, всё на ansistring сделано.


> четвёртый - это наверное "сложение" id-шников документов

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


> а пятый - работа с файлами

Собственно, профайлер именно это и показал. Более 90% затрат - файловые операции.


 
DevilDevil ©   (2013-03-12 17:29) [142]

> Ega23 ©   (12.03.13 17:25) [141]
> 2^11=2048> Низачот

да, да, сори :)
тем более !


 
Rouse_ ©   (2013-03-12 17:32) [143]


> Собственно, профайлер именно это и показал. Более 90% затрат
> - файловые операции.

Окстись - 97 процентов на файловых операциях, не хочешь? :)
Все остальное летает. Серверную часть будем делать (которая для онлайна) - 64 бита only, 16 гигов склероза, все в память и даже парится не придется.


 
Rouse_ ©   (2013-03-12 17:36) [144]

ЗЫ: ЛЕгыч ты уже вообще всю концепцию чтоль забыл?

> > вы сравниваете между собой строки, а не числа,
>
> Ну это да, тут ничего не поделаешь. Но на самом деле это
> не настолько критично, проблемы только в нестрогом соответствии
> на коротких токенах.
>
>
> > вы используете String, а не PAnsiChar
>
> Не используем мы стринг, всё на ansistring сделано.

1. Строки уже не сравниваются - написан свой аналог на базе RAW данных.
2. PAnsiChar используются только на этапе получения значения токена из внешних модулей, для поискового движка достаточно RAW режима


 
Ega23 ©   (2013-03-12 17:37) [145]


> Окстись - 97 процентов на файловых операциях, не хочешь? :)


А 97% это меньше 90, да?
Я не помню точное число. Вроде бы из 14.5 секунд 13.7 - на FastGetItemData было. Оно, правда, не точное, под профайлером время довольно субъективно. Но вот процентное отношение - довольно точное.


 
DevilDevil ©   (2013-03-12 17:40) [146]

> Ega23 ©   (12.03.13 17:25) [141]
> Rouse_ ©   (12.03.13 17:36) [144]

я предлагаю заканчивать флуд
лучше подумайте, кто мне будет помогать создавать быстрейший в мире парсер по XSD :)


 
Ega23 ©   (2013-03-12 17:41) [147]


>  Строки уже не сравниваются - написан свой аналог на базе
> RAW данных.


Сравниваются. Я спецом глянул. Но это на самом поиске, GetToken


 
Rouse_ ©   (2013-03-12 17:48) [148]


> DevilDevil ©   (12.03.13 17:40) [146]
> > Ega23 ©   (12.03.13 17:25) [141]
> > Rouse_ ©   (12.03.13 17:36) [144]
>
> я предлагаю заканчивать флуд
> лучше подумайте, кто мне будет помогать создавать быстрейший
> в мире парсер по XSD :)

Это с XML-ем? Если прислушаешься к озвученной мной и Олегом концепции вчерашней, по поводу совместимости с IXMLNode etc, то некоторое время (но оч маленькое два-три выходных максимум в месяц по шесть часов) мог бы выделить.


 
DevilDevil ©   (2013-03-12 17:56) [149]

Удалено модератором


 
Rouse_ ©   (2013-03-12 18:01) [150]

Удалено модератором


 
DevilDevil ©   (2013-03-12 18:07) [151]

Удалено модератором


 
Rouse_ ©   (2013-03-12 18:23) [152]

Удалено модератором


 
DevilDevil ©   (2013-03-12 18:35) [153]

Удалено модератором


 
Джимми Камерманн   (2013-03-12 18:54) [154]

Удалено модератором
Примечание: Внимание! В Форуме не принято обсуждение настоящих правил и политики модеpиpования.


 
Rouse_ ©   (2013-03-12 18:54) [155]

Удалено модератором


 
Джимми Камерманн   (2013-03-12 18:59) [156]

Удалено модератором


 
Rouse_ ©   (2013-03-12 19:04) [157]

Удалено модератором


 
DevilDevil ©   (2013-04-15 12:22) [158]

апдейты на сегодняшний день:

- немного изменил библиотеку и подходы
- отладил работу под x64 (в Delphi). Правда нужно немеряно памяти для стандартного чтения через TStringList в reading_benchmark

Благодаря пользователю Строчкин было найдено одно место, которое существенно тормозило запись файлов
Сейчас:
- баг исправлен
- в writing_benchmark добавлен вариант записи стандартным TextFile с буфером
- методы TCachedBufferWriter.Write() и TCachedBufferReader.Read() частично оптимизированы ассемблером под x86 и x64
- проведено тестирование на запись и чтение данных, разный размер и условия работы. Версия стабильна

скриншоты (Windows7, Delphi6):
http://a.fsdn.com/con/app/proj/cachedbuffers/screenshots/screen_reading.png
http://a.fsdn.com/con/app/proj/cachedbuffers/screenshots/screen_writing.png


 
DevilDevil ©   (2013-04-15 12:28) [159]

таки запись в 464 раза быстрее, чем стандартным TFileStream :)


 
DVM ©   (2013-04-16 19:06) [160]

Ну прям уж в 464. Это ни в коей мере не показывает и не доказывает какой либо ущербности tfilestream. Никому в здравом уме не придет в голову использовать tfilestream в чистом виде так как используется он в тесте. На пару с буферизованным декоратором он отстает совсем не намного уже.



Страницы: 1 2 3 4 5 вся ветка

Текущий архив: 2013.09.29;
Скачать: CL | DM;

Наверх




Память: 0.84 MB
Время: 0.019 c
15-1366144202
Юрий
2013-04-17 00:30
2013.09.29
С днем рождения ! 17 апреля 2013 среда


15-1365930191
Y-
2013-04-14 13:03
2013.09.29
Задачка про кривые


15-1366196955
O'ShinW
2013-04-17 15:09
2013.09.29
Data Mining/Поиск непойми чего в неизвестных таблицах, столбцах


15-1366093232
Y-
2013-04-16 10:20
2013.09.29
Какой самый лучши процессор у Intel?


8-1186063409
leonidus
2007-08-02 18:03
2013.09.29
Конвертирование BMP в GIF