• Тинькофф Банк-лучшие банковские продукты еще выгоднее
    Выбирайте продукт от банка Тинькофф
  • Уважаемые форумчане, друзья и посетители!
    Поступило предложение ( ссылка на обсуждение ) на сбор средств поддержания форума в рабочем состоянии с 1 июня ( оплата хостинга, бэкап ежедневный на другой хостинг и тд), отчетность будет предоставляться ежемесячно. Пока на ЮMoney ( яндекс деньги), доступно картой перевод, далее добавлю другие способы. Сумму перевода указывайте на ваш выбор исходя из своих возможностей.
    Форум продолжает свою работу благодаря Вашим пожертвованиям.

Вытащить данные в файл

Сделал я такой индикатор. Пишет в файл нормально, но возникла проблема, для больших файлов жрет память сильно, зависает и вылетает программа.
Дело в том, что этот индикатор пишет сначала в память, а затем выдает файл.
Как мне исправить код, чтобы в файл писалось построчно после каждого бара? То есть бар прочитали, записал и тд??
Нужно закрывать поток после каждой записи\чтения командой Close.
 
if(!_file_info.Exists)
{
FileStream fs = new FileStream("Путь имя файла и т.п." + ".txt", FileMode.OpenOrCreate, FileAccess.Write);

StreamWriter sw = new StreamWriter(fs);

sw.WriteLine(Данные.ToString() );

sw.Close();
}
 
if(!_file_info.Exists)
{
FileStream fs = new FileStream("Путь имя файла и т.п." + ".txt", FileMode.OpenOrCreate, FileAccess.Write);

StreamWriter sw = new StreamWriter(fs);

sw.WriteLine(Данные.ToString() );

sw.Close();
}
что-то у меня не выходит по вашему шаблону сделать, ошибки лезут (if(!_file_info.Exists) - вот это не пойму куда воткнуть)
 
что-то у меня не выходит по вашему шаблону сделать, ошибки лезут (if(!_file_info.Exists) - вот это не пойму куда воткнуть)
Правильно это же из примера. Все что Вам нужно было сделать это добавить в ваш код закрытие потока командой Close ))
 
Дельту побарно таким образом не рассчитать. Нужно каждый тик обрабатывать. А это миллионы тиков (если речь идет о популярных инструментах и хотя бы недельном периоде)

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

чтобы в файл писалось построчно после каждого бара?
Для истории это не нужно. В реал-тайме для баров достаточно дописывать в файл через AppendAllText

Держите пример. Работает быстро. Памяти потребляет копейки.
 

Вложения

  • Export.cs
    3,4 КБ · Просмотры: 9
Для истории это не нужно. В реал-тайме для баров достаточно дописывать в файл через AppendAllText
Это все реализовано. В реалтайме пишет как надо.
Проблема в записи истории. Если писать историю за большой период, то все виснет.
У думаю может запись истории разбить на блоки, например по 10 тысяч баров писать, затем сбрасывать как-то, затем дописывать и так до конца истории...?
 
Не надо ничего разбивать. В моем примере выше 25000 исторических баров пишутся за 0.5 сек.
 
Сколько данных с бара? И сколько оперативки имеется?
 
Итак, тест.
Кол-во баров на графике - 3 248 295.
Снимаем с каждого бара 6 метрик.
Итоговый текстовый файл - 158 мегабайт.
Среднее время прохождения теста - 17 секунд.
Увеличение потребления памяти - 600-700 мегабайт (для нынешних систем это копейки).
Это всё без оптимизаций типа принудительной сборки мусора или разбивки на части.
Естественно, ничего не виснет и не вылетает.

Вывод: проблемы топикстартера не являются общим местом для NT8.
 
Update
Распараллерив обработку, достиг 9 секунд.
На современных 8/16 камнях вполне можно получить 2-3 секунды.
 
Назад
Верх Низ