Загрузка котировок в базу данных - страница 4

 
BullDozer_ru:

Добрый день!

 Хочу создать своего торгового робота. Прогностические модели создавал и ранее, но они не касались трейдинга. Всегда использовал для этого SAS Base + БД. 

Подскажите, пожалуйста, как можно загрузить историю котировок в базу данных? 


https://www.mql5.com/ru/code/93


автор этого проекта правильно сказал :


AdoSuite v 1.0
AdoSuite v 1.0
  • голосов: 32
  • 2010.04.01
  • Alexander
  • www.mql5.com
Набор классов для работы с базами данных через интерфейсы ODBC и OLE DB.
 

В общем, препарировал тут еще раз на обычном компе, но с очень хорошим ssd: samsung 950 pro (pci-e).

Задача та же. 730Мб csv импортировался больше 4 минут (на сервере -2:30). Процессор - не загружен, ОЗУ - навалом; контроллер диска забит на 100%, при чем скорость обмена мизерная: 10-40 Мб/сек.

Включил запрет очистки кэша диска (без UPSа лучше не включать): получил скорость импорта 1:15 (ускорился более чем в 3 раза, и в 2 раза быстрее, чем на сервере).


А происходит там вот что: сначала таблица создается во временной базе (700Мб), потом переносится в мою базу (те же 700Мб), да еще и пишется журнал транзакций (лог) размером 5Гб(!).

Т.е. исходные данные "разрастаются" в 9 раз примерно. И запись происходит, видимо, очень маленькими блоками.

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


Я все понимаю, конечно - надежность, целостность данных и все такое. Но это как-то дороговато (в плане времени) получается. Вот не понимаю я этих восторгов - глючная, тормозная хрень.

 
Vladimir Kazakov:

В общем, препарировал тут еще раз на обычном компе, но с очень хорошим ssd: samsung 950 pro (pci-e).

Задача та же. 730Мб csv импортировался больше 4 минут (на сервере -2:30). Процессор - не загружен, ОЗУ - навалом; контроллер диска забит на 100%, при чем скорость обмена мизерная: 10-40 Мб/сек.

Включил запрет очистки кэша диска (без UPSа лучше не включать): получил скорость импорта 1:15 (ускорился более чем в 3 раза, и в 2 раза быстрее, чем на сервере).


А происходит там вот что: сначала таблица создается во временной базе (700Мб), потом переносится в мою базу (те же 700Мб), да еще и пишется журнал транзакций (лог) размером 5Гб(!).

Т.е. исходные данные "разрастаются" в 9 раз примерно. И запись происходит, видимо, очень маленькими блоками.

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


Я все понимаю, конечно - надежность, целостность данных и все такое. Но это как-то дороговато (в плане времени) получается. Вот не понимаю я этих восторгов - глючная, тормозная хрень.


Владимир ! 

по вышесказанному

у тебя не настроен SQL сервер

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


1  у тебя стоит модель базы Recovery model: full  --- переведи в simple - это делается  если прокликать правой кнопкой мыши саму базу -  в которую ты заливаешь - и найти закладку с ключевым  словом

   для такой примитивной задачи  которую мы выполняем достаточно режима simple и не будет ненужного нам журнала транзакций ...

   режим full  применяют в серьезных системах например банковских


2 отдай sql серверу ВСЮ память машины  - как раз ту самую память которой  навалом  - это делается уже в настройках самого сервера

   sql сервер будет значительно быстрей работать если вся память сервера будет у него !  на серверах где ставят SQL  допустим  64 гига  отдают серверу не менее 48ггб

  там где 128 можно отдать 110

вообще расчет озу можно сделать так

например у сервера 36ггб ( для винды оставить 4ггб если процессоров  8  то 1,5 на каждый проц еще - остальное серверу ) у кого 2003 сервер можно оставить винде 2 ггб а не 4

36 - 4 - 1.5*8 = 20 ГБ

3   распределитьь базу на несколько дисковых массивов как правило у sql серверов их несколько - при этот файл для лога желательно также положить на отдельный диск - это даст значительный прирост дисковых операций

4 при первичном наполнении однозначно наблюдается низкое  быстродейсвие -  что бы исключить это достаточно изначально задать расчетный размер -  дабы исключить инкрементного изменения самой базы

    даже при не очень серьезных закачках - его быть не должно

    


хотя бы это уже даст прирост

правда еще можно много чего отстроить

--


Vladimir Kazakov:

Задача та же. 730Мб csv импортировался больше 4 минут (на сервере -2:30).

В общем, препарировал тут еще раз на обычном компе, но с очень хорошим ssd: samsung 950 pro (pci-e).

этот компьютер не для работы c SQL сервером!

 я показал выше свои скорости ! это реальные скорости

Vladimir Kazakov:
... - глючная, тормозная хрень.

Владимир  неправда твоя - нехорошо хаять инструмент если его не умеешь использовать

Я не хочу обижать -  просто наводится ассоциация с басней Крылова  Пробившись попусту час целой,  Пошла и говорит с досадою: «Ну, что́ ж! На взгляд-то он хорош, Да зелен — ягодки нет зрелой: Тотчас оскомину набьешь».


вообще - если не получается  использовать инструмент -  разумно отказаться от него





 

Симпл рекавери включал - разницы никакой. Файлы разбрасывал - разница в пределах погрешности. Тем не менее на "неподходящем" компьютере результат вдвое превосходит сервер.

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

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


зы Что значит не получается использовать? Скорость у меня получилась не хуже, чем у тебя. Но мне ее сильно не хватает. Из С++ на порядок быстрее получается.

 
Vladimir Kazakov:

Симпл рекавери включал - разницы никакой. Файлы разбрасывал - разница в пределах погрешности. Тем не менее на "неподходящем" компьютере результат вдвое превосходит сервер.

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

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


зы Что значит не получается использовать? Скорость у меня получилась не хуже, чем у тебя. Но мне ее сильно не хватает. Из С++ на порядок быстрее получается.

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

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

--

ну вот это верно

когда все настроено - летает как положено

и выбрать можно очень быстро и гибко все что угодно - и минутку набить и найти  закономерности - но это уже надо достаточно хорошо знать сам язык  SQL

на sql минутку собираю за 2 секунды с 5,000,000 записей

скорость сборки минутки на Си++ у тебя равно 2 секундам на 5 миллионах записей ? 



 

Добавлю свои 5 копеек.

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

Удачи

The column-store pioneer | MonetDB
  • www.monetdb.org
Column-store features When your database grows into millions of records spread over lots of tables and used in business or science data warehouse applications, you really want a column-store database management system. MonetDB innovates at all layers of a DBMS, e.g. a storage model based on vertical fragmentation, a modern CPU-tuned query...
 
Yuriy Zaytsev:

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



 

Это Вы батенька загнули...
 
Vladimir Perervenko:
Это Вы батенька загнули...

Вы уверены на что при объемах базу  4 5 10 трб   матлаб  обгонит по скорости ОБРАБОТКИ данных например MS SQL ?

 
Vladimir Kazakov:

В общем, препарировал тут еще раз на обычном компе, но с очень хорошим ssd: samsung 950 pro (pci-e).

Задача та же. 730Мб csv импортировался больше 4 минут (на сервере -2:30). Процессор - не загружен, ОЗУ - навалом; контроллер диска забит на 100%, при чем скорость обмена мизерная: 10-40 Мб/сек.

Включил запрет очистки кэша диска (без UPSа лучше не включать): получил скорость импорта 1:15 (ускорился более чем в 3 раза, и в 2 раза быстрее, чем на сервере).


А происходит там вот что: сначала таблица создается во временной базе (700Мб), потом переносится в мою базу (те же 700Мб), да еще и пишется журнал транзакций (лог) размером 5Гб(!).

Т.е. исходные данные "разрастаются" в 9 раз примерно. И запись происходит, видимо, очень маленькими блоками.

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


Я все понимаю, конечно - надежность, целостность данных и все такое. Но это как-то дороговато (в плане времени) получается. Вот не понимаю я этих восторгов - глючная, тормозная хрень.

Во-первых, логирование таблицы в которую идет запись надо отключать или создавать с опцией типа NOLOGGING. Если включено логирование на таблице, все состояния при выполнении DML операций идут в лог чтобы можно было восстановить данные на любой момент времени.

Во-вторых, удалить индексы таблицы до вставки данных и создать после вставки. Если существуют индексы, они будут перестраиваться каждый раз при любой DML операции. Кстати, если есть триггеры на таблице - тоже отключить до вставки.

В-третьих, используйте возможности BULK INSERT и транзакционность если база поддерживает. Транзакции позволят сгруппировать данные в памяти, а по завершению записать на диск, в противном случае на диск будет записываться каждая новая строка. А BULK INSERT и существует для массовой вставки больших объемов данных.

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

 
Yuriy Zaytsev:

Вы уверены на что при объемах базу  4 5 10 трб   матлаб  обгонит по скорости ОБРАБОТКИ данных например MS SQL ?

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

Например, когда я своем тестере стратегии заменил модуль по работе с ордерами на ДЛЛ на шарпе, которая делала то же самое, скорость увеличилась около 2 раз.