Блог им. FineLogin

Лайфхак QLUA для загрузки больших данных

    • 27 апреля 2023, 22:45
    • |
    • GOLD
      Популярный автор
  • Еще
Мой дорогой друг, если ты гоняешь бэктесты в QLUA, то тебе регулярно приходится загружать исторические данные. Как правило, это текстовый файл с тысячами строк в формате D,T,O,H,L,C,V:

20220915,090000,61420,61497,61406,61464,241
20220915,090100,61460,61476,61420,61451,160
20220915,090200,61444,61489,61436,61479,185

Осмелюсь предположить, что эти строки ты заливаешь в массив с помощью string.match. Это готовый парсер строки с разделителем. Работает достаточно шустро. Я на нем сидел пару лет.

Когда данных не много, такой метод загрузки не напрягает. Но когда за день 20-30 раз загружаешь сотни тысяч или миллион строк, то потери времени становятся невыносимыми.

Стал искать способ ускорить этот процесс. И он таки нашелся. Выяснил следующее:

Если строки в файле истории сконвертировать в такой вид (делается 1 раз):

table.insert(MyTable,{«20220915»,«090000»,61420,61497,61406,61464,241})
table.insert(MyTable,{«20220915»,«090100»,61460,61476,61420,61451,160})
table.insert(MyTable,{«20220915»,«090200»,61444,61489,61436,61479,185})

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

В пять раз, Карл!

Бери и пользуйся))

★2
8 комментариев
Так, пусть Lua сам и конвертирует. Простенький скрипт. Че нам-то напрягаться.)
Сразу получится в 10 раз быстрее.)
avatar
3Qu, каким инструментом конвертировать файл — не важно… это нужно сделать один раз в жизни))

ускорение происходит за счет того, что вместо парсинга строк происходит заливка массива напрямую
avatar
$100, 
каким инструментом конвертировать файл — не важно
Да, согласен. Тогда лучше, уж, сразу конвертировать так.
MyTable = {{Str1}, {Str2},....., {StrN}}
Сразу получаем готовую переменную MyTable, без всяких insert.)
Или как-то так. Подзабыл я слегка Lua.
avatar
Мой дорогой друг, если ты гоняешь бэктесты в QLUA, то

… подумай о том, что в жизни надо что-то менять )))

(Шутка. Возможно, действительно полезный лайфхак. Не могу оценить.)
avatar
Jame Bonds, нуу… уж лучше гонять бэктесты, чем сливать бабло без тестов))
avatar
а если не использовать тугую table.insert, то будет еще быстрее загружаться
пример:
MyTable[1]={«20220915»,«090000»,61420,61497,61406,61464,241}
MyTable[2]={«20220915»,«090100»,61460,61476,61420,61451,160}
string.match работает медленно, потому что регулярка каждый раз компилмруется при выполнении. Это же очевидная вещь.
Если надо быстрее то надо отдельно один раз компилять регулярку а потом использовать много раз.
Например используя => github.com/mah0x211/lua-regex
------------

Это же тривиально.
avatar
Beach Bunny, правда эта либа зависит от нативной pcre2, пусть уж компилирует каждый раз)
avatar

теги блога GOLD

....все тэги



UPDONW
Новый дизайн