Повторное использование строки

Страницы: 1
RSS
Повторное использование строки
 
Как-то уже об этом писал...
Есть строка mess (age), в которой коллбэки накапливают свой вывод, при превышении определённой длины строка записывается в файл. Потом обычно пишут mess='', чтобы сбросить длину строки в 0, но что в этом случае произойдёт? Создастся новая строка, или в структуре TString для этой строки её длина установится в 0?
Я не вижу, где хранится число байтов, выделенных под строку, и как контролируется выход за её предел при дописывании к строке?
Не хочется ненужного пересоздания строки и сборки мусора, а хочется просто зарезервировать под строку 10 Мб и использовать эту же память под строку постоянно. Зачем выметать сор из избы строки, если можно обойтись без этого? Как это всё оптимизировать и сделать, как в нормальных языках типа того же си?
 
Кто-то предлагал вместо наращивания строки запоминать каждый вывод коллбэка в строку таблицы t, а потом делать
Код
s = table.concat(t)
Но это тоже дурацкий костыль для обхода неизменяемости строк Луа... Чувствую, что можно сделать, как я хотел в #1...
 
Мне кажется, что ничего не случится, если извне (из длл) строка будет изменена, ведь, если строка не находится внутри таблицы, вычисление хеша от неё не нужно?
 
1.
Цитата
Serge123 написал:
Есть строка mess (age), в которой коллбэки накапливают свой вывод, при превышении определённой длины строка записывается в файл.
 Почему бы не записывать строку сразу в файл (в системе это буферизуется). Вы проверяли, сколько записей выполняется в файл за 1 секунду, если писать напрямую? Если вы это сделаете, то, возможно, удивитесь.
  Вообще то, если для вас важна эффективность, то имеет смысл, прежде чем заниматься оптимизацией,  выяснять: а нужно ли это делать. Эффективнее всего выполняется то, что ничего не делает :smile:.

2.
Цитата
Serge123 написал:
Мне кажется, что ничего не случится, если извне (из длл) строка будет изменена, ведь, если строка не находится внутри таблицы, вычисление хеша от неё не нужно?
  Если нет желания заниматься длительной научно-исследовательской деятельностью, то для взаимодействия dll и Lua надо использовать только C API.
------
  И «перегруженный» анекдот про чукчу:
Чукча и геолог ловят рыбу зимой на льду. Геолог приехал на рыбалку на снегоходе, а чукча пришел на лыжах. Вдруг видят направляющегося к ним голодного белого медведя. Ружья нет.
Чукча хватает лыжи и начинает их надевать. Геолог:
- Бесполезно. Все равно ты не сможешь бежать быстрее медведя.
- А мне и не надо бежать быстрее медведя. Мне достаточно того, что медведь сюда добежит раньше, чем ты заведешь свой быстро бегающий снегоход.
 
И всё-таки, я на этом форуме несколько раз видел, что людям издавна не хватает скорости (и для них это "жизненно важно"), а наращивание числа ядер и повышение тактовой частоты мало что не даёт, вот ещё пример такой темы: https://forum.quik.ru/forum10/topic3872/

А геологам просто надо держать свои снегоходы заведёнными. :smile:
 
Тут дело не в том, что есть запись на диск, а в том, что за 1 мкс десятки раз может выполняться оператор
Код
mess = mess .. <строка от коллбэка>
что будет приводить к созданию новой строки и переписыванию в неё содержимое старой, которую должен убрать сборщик мусора. И ЦП будет занят этой бесполезной издевательской работой. Я считаю, что в этом причина торможения.
 
И да, ваш перегруженный вариант анекдота некорректен: ведь я с самого начала играл на стороне чукчи...
 
Можно найти, что эта тема (чудовищная конкатенация строк в Луа) волнует народ в районе англоязычного stackoverflow, а здесь создатель Луа предлагает такую полумеру: https://www.lua.org/pil/11.6.html
 
Цитата
Serge123 написал:
Тут дело не в том, что есть запись на диск, а в том, что за 1 мкс десятки раз может выполняться оператор
   Где вы обнаружили коллбеки QUIK, вызываемые десятки раз за 1 мкс?
   Не знаю, будет ли для вас это существенно, но одна из моих практических профессиональных специализаций: параллельное программирование и разработка систем реального времени. Возможно я ошибаюсь, но у меня возникло представление, что вы пытаетесь бороться с привидениями, многие из которых у вас не материализуются :smile:.
 
Цитата
TGB написал:
Где вы обнаружили коллбеки QUIK, вызываемые десятки раз за 1 мкс?
В OnAllTrade видел: время на сервере биржи с точностью 1 мкс не меняется, а в файл записалось больше 64 сделок...
 
Цитата
Serge123 написал:
В OnAllTrade видел: время на сервере биржи с точностью 1 мкс не меняется, а в файл записалось больше 64 сделок...
    Этот коллбек я до сих пор не использовал. Поэтому пока мне сказать относительно него нечего.
 
Цитата
TGB написал:
Этот коллбек я до сих пор не использовал.
Тогда посмотрите на кусочек от вывода моего Луа скрипта, который обрабатывал OnAllTrade от 4 января 2023 г.:
Скрытый текст
Он записывал из таблицы, переданной ему, тикер, время, цену, количество лотов и направление сделки. И таких строк с тем же самым тикером и временем набралось 58. И это только по одному тикеру, а ещё работал обработчик OnQuote, который в этот же файл выводил содержимое стаканов.
Вот ещё кусочек из того же файла, со стаканами:
Скрытый текст
 
Не очень понятно зачем это делать через объединение строк.
У меня такие потоки для каждой новой записи просто пишутся в файл через
f:write(str..'\n')

Плюс организован счетчик добавленных строк. Когда их больше порога, скажем 100, сбрасываем на диск
f:flush()

И не очень понятно зачем это делать в колбеке OnAllTrade, загружая поток терминала. Да, конечно, так можно, но если скрипт запускается в середине торгового дня, да и просто перезапускается, то необходимо сканировать таблицу и записывать в файл пропущенные записи. Раз так, то проще сделать так и для новых записей.
 
Цитата
Serge123 написал:
Тогда посмотрите на кусочек от вывода моего Луа скрипта, который обрабатывал OnAllTrade от 4 января 2023 г.:
  Я согласен с тем, что написал Nikolay.
  Но если вы хотите разобраться с тем как вызываются коллбеки OnAllTrade реально, то в ваш вывод нужно добавить колонку времен вызова этого коллбека (используя функцию QLua os.sysdate() с детализацией до микросекунд).
 
Когда я это делал, то только начал писать на Луа, не знал, что мне нужно делать, и какая дорога к деньгам более прямая. Просто хотел накопить таких файлов и попробовать найти закономерности взлёта цены. И у меня околонаучный склад ума, как у киплинговского слонёнка: хочется копать вглубь и искать там золотые самородки. До сих пор ничего роботоподобного не сделал...
На этом форуме могут до кровохарканья обсуждать двойные и тройные очереди, показывать загадочные картинки, от которых рябит в глазах, но ничего действительно полезного не скажут.
 
Цитата
Serge123 написал:
Когда я это делал, то только начал писать на Луа, не знал, что мне нужно делать, и какая дорога к деньгам более прямая. Просто хотел накопить таких файлов и попробовать найти закономерности взлёта цены. И у меня околонаучный склад ума, как у киплинговского слонёнка: хочется копать вглубь и искать там золотые самородки. До сих пор ничего роботоподобного не сделал...
На этом форуме могут до кровохарканья обсуждать двойные и тройные очереди, показывать загадочные картинки, от которых рябит в глазах, но ничего действительно полезного не скажут.
В этом нет ничего странного. Количественный анализ ленты сделок - это обычная практика, особенно вместе с анализом стакана DOM. Правда, конечно, это обычно не записывают в линейный файл, а используют базы данных.
Квик позволяет это делать без всяких скриптов, достаточно настроить выгрузку через ODBC из таблицы.
База данных позволит строить аккумуляцию, агреггацию, фильтрацию и т.д. Причем делать это быстро.
 
1.
Цитата
Serge123 написал:
хочется копать вглубь и искать там золотые самородки. До сих пор ничего роботоподобного не сделал...
  Прежде чем копать, наверное, стоит выбрать место для копания. То есть, сначала поторговать вручную, чтобы понять что это такое, но без фанатизма, чтобы не слить весь ваш депозит. При этом надо понимать, что реально работающую стратегию, стабильно, без провалов, приносящую доход хотя бы в 20% (в текущий момент) на годовом периоде, вам никто не предложит. Подумайте, зачем банкам бегать за клиентами с предложениями кредитов под 15% если на фондовом рынке можно заработать 20%. Фондовый рынок, локально, это игра с "псевдо-нулевой" суммой (деньги на нем не создаются а перераспределяются) и если какая то стратегия оказывается выигрышной, а затем получает широкое распространение, то она перестает работать.
  После некоторого периода ручной торговли сделайте простого робота исключительно на QLua, который смог бы вас заменить, а также торговать на истории. И только после этого начните поиск своей стратегии и оптимизацию того, что имеет смысл оптимизировать.

2.
Цитата
Serge123 написал:
На этом форуме могут до кровохарканья обсуждать двойные и тройные очереди, показывать загадочные картинки, от которых рябит в глазах, но ничего действительно полезного не скажут.
 Не согласен (частично). Конечно, на форуме много флуда, но тот же Nikolay написал вам практически все об обработке обезличенных сделок.
 
Цитата
Serge123 написал:
Как-то уже об этом писал...
Есть строка mess (age), в которой коллбэки накапливают свой вывод, при превышении определённой длины строка записывается в файл. Потом обычно пишут mess='', чтобы сбросить длину строки в 0, но что в этом случае произойдёт? Создастся новая строка, или в структуре TString для этой строки её длина установится в 0?
Я не вижу, где хранится число байтов, выделенных под строку, и как контролируется выход за её предел при дописывании к строке?
Не хочется ненужного пересоздания строки и сборки мусора, а хочется просто зарезервировать под строку 10 Мб и использовать эту же память под строку постоянно. Зачем выметать сор из  избы  строки, если можно обойтись без этого? Как это всё оптимизировать и сделать, как в нормальных языках типа того же си?
Если Вы это сообщение выводите в файл, то пишите сразу в файл. куски сообщения.
Каждый новый кусок добавится в конец файла
В итоге Вам не надо наращивать строки.
 
Цитата
nikolz написал:
Если Вы это сообщение выводите в файл, то пишите сразу в файл. куски сообщения. Каждый новый кусок добавится в конец файлаВ итоге Вам не надо наращивать строки.
  nikolz писатель?  
  Зачем вы пишите, то что было уже написано два раза?:
1)
Цитата
TGB написал:
Почему бы не записывать строку сразу в файл (в системе это буферизуется). Вы проверяли, сколько записей выполняется в файл за 1 секунду, если писать напрямую? Если вы это сделаете, то, возможно, удивитесь.
2)
Цитата
Nikolay написал:
У меня такие потоки для каждой новой записи просто пишутся в файл черезf:write(str..'\n')
  Вы так спамите или не умеете читать :smile: ?
 
Цитата
TGB написал:
Цитата
nikolz написал:
Если Вы это сообщение выводите в файл, то пишите сразу в файл. куски сообщения. Каждый новый кусок добавится в конец файлаВ итоге Вам не надо наращивать строки.
   nikolz писатель?  
  Зачем вы пишите, то что было уже написано два раза?:
1)  
Цитата
TGB написал:
Почему бы не записывать строку сразу в файл (в системе это буферизуется). Вы проверяли, сколько записей выполняется в файл за 1 секунду, если писать напрямую? Если вы это сделаете, то, возможно, удивитесь.
2)  
Цитата
Nikolay написал:
У меня такие потоки для каждой новой записи просто пишутся в файл черезf:write(str..'\n')
   Вы так спамите или не умеете читать :: ?
А вы догадайтесь.
 
Цитата
TGB написал:
При этом надо понимать, что реально работающую стратегию, стабильно, без провалов, приносящую доход хотя бы в 20% (в текущий момент) на годовом периоде, вам никто не предложит.
Я безо всякой "стратегии" как раз этим давно занимаюсь, акциями металлами я уже давно не торгую и уже отвык от этих стрёмных активов. Я ещё в октябре "силовым методом" получил статус квала и получаю взаймы от брокера столько, что можно купить квартирку в Москве (но, правда, не для всех активов). Проблема, как успеть продать лишнее по цене на шаг выше, а не по цене покупки...

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

Кстати, я вчера день потратил на выяснение возможности повторного использования строки и выяснил, что это невозможно, т.к. Луа при малейшей попытке конкатенации моментально отправляет эту строку в мусор, пусть даже её длина равна 0 (очевидно, проверок не делается). Поэтому, надо либо держать строки в массиве и использовать concat, либо в длл.
 
Цитата
nikolz написал:
А вы догадайтесь.
   Судя по тому, что вы всегда цитируете сообщения полностью (даже самые длинные), вы, наверное, спамер. Но нельзя исключать с учетом качества выдаваемого вами текста, что вы полуинтеллектуальный робот-спамер :smile: .
 
Цитата
TGB написал:
Цитата
nikolz написал:
А вы догадайтесь.
    Судя по тому, что вы всегда цитируете сообщения полностью (даже самые длинные), вы, наверное, спамер. Но нельзя исключать с учетом качества выдаваемого вами текста, что вы полуинтеллектуальный робот-спамер :: .
Вы любитель ярлыков?
----------------------
вас так колебет что я повторно написал то, что Вы написали выше?
-------------------
 
Цитата
TGB написал:
Цитата
nikolz написал:
А вы догадайтесь.
    Судя по тому, что вы всегда цитируете сообщения полностью (даже самые длинные), вы, наверное, спамер. Но нельзя исключать с учетом качества выдаваемого вами текста, что вы полуинтеллектуальный робот-спамер :: .
Попробуйте не вешать ярлыки, а спорить предметно.
 
Цитата
nikolz написал:
вас так колебет что я повторно написал то, что Вы написали выше?
  Переживаю за то, что много мусора на форуме и могут переполниться его база :smile:
 
Цитата
TGB написал:
Цитата
nikolz написал:
вас так колебет что я повторно написал то, что Вы написали выше?
   Переживаю за то, что много мусора на форуме и могут переполниться его база ::
Спите спокойно, товарищ.
Эту проблему разработчики решат без нас.
 
Цитата
TGB написал:
Почему бы не записывать строку сразу в файл (в системе это буферизуется). Вы проверяли, сколько записей выполняется в файл за 1 секунду, если писать напрямую? Если вы это сделаете, то, возможно, удивитесь.
Я кэш буферам виндовс уже давно не удивляюсь, на диске тоже что-то похожее есть... Если писать с буферизацией, то сначала кусочки будут переписываться из памяти в память, а потом на диск, а если я сам буду писать без буферизации, то, как я надеюсь, винда будет писать сразу на диск. Хотя, в принципе, не факт, что это будет быстрее, тут опять нужны эксперименты (за которые денег не дают).
Страницы: 1
Читают тему
Наверх