Transaq
СБО "Transaq" => Подсистема ATF => Topic started by: Heller on Марта 17, 2014, 11:08:49 am
-
Сделали новую сборку, главное отличие которой от прошлых - переработанный механизм сборки мусора в памяти в ATF. У ряда пользователей были проблемы с тем, что за день или несколько дней работы ATF съедал всю память, предположительно в этой сборке проблема должна быть решена:
http://transaq.ru/cl_files/v508/508Trader.336.22.zip
Переработка довольно сложная, поэтому пока это сборка тестовая, было бы полезно, если бы пользователи, которые сталкивались с проблемой "out of memory" или подобными проблемами с памятью, попробовали её и сообщили исчезла ли проблема.
-
Здравствуйте.
С новой сборкой не работает следующий код:
function onKeyDown(var id){
var order=new_object("hash");
order["condvalue"]=111;
signal::alertMultiple(order["condvalue"]);
}
Т.е. проблема с созданием "хэша".
Робот загнулся из-за этого ((
-
Да, мы уже нашли ошибку, эту тему удалю, в понедельник будет новая сборка.
-
Когда будет обновление?
-
Уважаемый Heller! В какой понедельник будет новая сборка?
-
Новая сборка здесь
http://transaq.ru/cl_files/v508/508Trader.336.24.zip
-
За 30 минут транзак так и не загрузился. Пришлось откатиться.
-
Да вроде работает все, навскидку. И с памятью стало намного гуманней.
-
В каком смысле так и не загрузился?
-
Попробовал ещё раз без загрузки экрана. Вроде нормально. Жаль всё вручную пришлось восстанавливать.
-
что-то не особо радует сборка...
на одном компьютере вообще подключение не устанавливается.
На другом память так же улетает. за в секунду по несколько Мб.
Вот участок кода из calc() который в этом виновен
var ids = getAllOrderIDs();
var z_id;
while (ids.size() > 0) {
z_id = ids.shift();
var z = getOrder(z_id);
if (z["secid"] != ins["secid"]) {
continue;
}
if (z["status"] == OS_WATCHING) {
return;
}
}
если его убрать, то всё хорошо
P.S. Методом последовательной итерации было выявлено, что это из-за функции getOrder()
-
То что память тратится большой проблемы нет - сборщик мусора запускается время от времени и память очищает (хотя по состоянию в диспетчере задач этого не будет видно, т.к. память остаётся зарезервированной для дальнейшего использования). Так что улетевшие несколько мегабайт в конце концов вернутся.
Вы кстати используете сборку 336.24? В ней исправлены серьёзные ошибки нового сборщика мусора.
-
Да, я использую последнюю версию. Но когда в диспечере задач память доходит до 2 Гб, то Transaq вылетает с ошибкой и создаётся файл Crash Report нулевого размера.
-
Можете прислать ваш скрипт на support@transaq.ru?
-
Уважаемый Heller, проверьте, пожалуйста, последнюю сборку.
Приложил скрины. На них видно, что за 2 минуты "скушало" 10 Мб. Сборка 5.08.336.24 rev 55.
Мне ОЧЕНЬ нужно чтобы данный робот работал. Вы понимаете, что с этим связаны деньги.
Если нужна какая-то помощь - Вы только скажите. Я знаю что язык ATF поддерживается только разработчиками, но на нём всё же работают люди. Так что прошу помочь всем нам ))
-
Такой дополнительный вопрос. Я нашёл проблему, связанную с тем, что сборщик мусора работает только для индикатора, непосредственно добавленного на график. То есть если индикатор использует IndRef для пользовательских индикаторов, активно использующих память, то сборщик мусора для этих внешних индикаторов не будет запускаться, а это поправлю. Посмотрите в своём коде, не тот ли это случай?
Проблема так же может быть ещё и вот в чём. Сборщик мусора так написан, что он запускается на каждой новой свечке, и за один проход он отсеивает примерно половину ненужных объектов (этот подход менее экономен по памяти, но более эффективен по скорости).
Таким образом если во время расчета индикатора во время каждой свечи происходит примерно одинаковое количество сделок и на каждую сделку выделяется примерно одинаковое количество объектов, память постепенно будет очищаться (примерная формула x_{n+1} = (x_n+D)/2, легко увидеть, что предел по затратам памяти всегда D).
По всей видимости на каждую последующую сделку в вашем скрипте требуется всё больше и больше памяти, что приводит к означенной проблеме. Вероятно раньше на ранних сборках этого не наблюдалось, т.к. в принципе ранее на каждый объект требовалось в среднем раза в четыре меньше памяти, нежели сейчас.
Но в любом случае пока кажется, что проблема в вашем скрипте. Не исключено, конечно, что ошибка всё же у нас, а ваш скрипт на неё всё же нарывается, но пока я никак не могу ничего подобного воспроизвести. Если пришлёте ваш скрипт, то вероятно я что-то найду.
-
Я не использую IndRef. В скрипте просчитывается свой индикатор и выводится на график.
Мне кажется дело не в этом...
Сегодня на демо счёте тестировал новую стратегию на 4 бумагах. Функция getActiveOrderIDs() не работает, т.е. при активной отложенной заявке возвращает 0. Поэтому у меня на каждом тике проверяется наличие заявки:
var ids = getAllOrderIDs();
var z_id;
while(ids.size()>0){
z_id=ids.shift();
var z=getOrder(z_id);
if(z["secid"]!=ins["secid"]){continue;}
if(z["status"]==OS_WATCHING || z["status"]==OS_FORWARDING || z["status"]==OS_ACTIVE){
return;
}
}
Всё работает нормально, память уходит медленно, но я допустил ошибку и у меня выставилось по несколько сотен заявок сразу по 4 бумагам, т.е. в сумме около 1000 заявок. Я их сразу же удалил, исправил и память стала улетать десятками Мб в секунду.
Я уже вынес все переменные в глобальную область видимости, но всё равно. Такое ощущение, что переменная при каждом проходе цикла записывается в новую ячейку памяти.
-
а может просто переменную z сделать глобальной типа static? будет всего одна постоянно перезаписываемая (вместо сотен или тысяч вновь созданных за одну свечу - до следующей уборки мусора).
кстати, а зачем на каждом тике запрашивать массив ВСЕХ заявок - может стоит запоминать id только нужных (требующих отслеживания) заявок и проверять периодически их статус. Даже если их 100 одновременно и статус их нужно знать на каждом тике - с точки зрения памяти это может быть более экономным.
-
Я уже делал глобальные static переменные.
Конечно можно и так сделать. Но надо же ошибки ATF исправлять ))
-
Попробуйте вот это обновление:
http://transaq.ru/cl_files/v508/508Trader.336.25.zip