GOLD
GOLD личный блог
27 апреля 2023, 22:45

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

Мой дорогой друг, если ты гоняешь бэктесты в 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 каждой строки, то скорость загрузки исторических данных вырастет примерно в пять раз.

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

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

8 Комментариев
  • 3Qu
    27 апреля 2023, 23:13
    Так, пусть Lua сам и конвертирует. Простенький скрипт. Че нам-то напрягаться.)
    Сразу получится в 10 раз быстрее.)
      • 3Qu
        27 апреля 2023, 23:31
        $100, 
        каким инструментом конвертировать файл — не важно
        Да, согласен. Тогда лучше, уж, сразу конвертировать так.
        MyTable = {{Str1}, {Str2},....., {StrN}}
        Сразу получаем готовую переменную MyTable, без всяких insert.)
        Или как-то так. Подзабыл я слегка Lua.
  • Jame Bonds
    27 апреля 2023, 23:33
    Мой дорогой друг, если ты гоняешь бэктесты в QLUA, то

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

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

    Это же тривиально.
    • Некто
      29 апреля 2023, 13:34
      Beach Bunny, правда эта либа зависит от нативной pcre2, пусть уж компилирует каждый раз)

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн