Прожорливость памяти ОЗУ MT5, проблемы с чтением/записью больших файлов - страница 3

 
Vladislav Andruschenko:
Ооп

Я вижу что ооп.. зачем массивы в строки писать, когда в бинарники сразу можно

 
Maxim Dmitrievsky:

Я вижу что ооп.. зачем массивы в строки писать, когда в бинарники сразу можно

Написано же, человек их в экселе обрабатывает.

 
Sergey Savinkin:

Написано же, человек их в экселе обрабатывает.

не написано такого

 
Maxim Dmitrievsky:

не написано такого

Самый первый пост. Если внимательно читать, это этот файл может и не иметь отношения к МТ5. Или обрабатывается специфически.

 
Sergey Savinkin:

Самый первый пост. Если внимательно читать, это этот файл может и не иметь отношения к МТ5. Или обрабатывается специфически.

ну так пусть определится откуда он его берет

тоже можно как массив читать, наверное
 
Aleksey Vyazmikin:

Спасибо за анализ кода.

Я с большим трудом понимаю ООП, поэтому вносить туда правки для меня мучение. Как я понял, что дело в классе, который отвечает за чтение, что там весь файл разбивается в строковые массивы, и только потом, по моему желанию, я преобразовываю эти строковые значения в иной тип и кладу в массивы уже типа int в своем скрипте. Если я правильно понимаю, то для ускорения процесса надо прочитать весь файл и понять сколько строк и столбцов всего и сколько в каждой такой ячейки символов, а уже под них выделить сразу размер массива? Тогда как это сделать?

Хотелось бы понять откуда берется 400 мегабайт сразу? Я правильно понял, что память выделяется, но не очищается/отдается ранее выделенная?

400 Мб это 36 млн. ячеек с пустыми строками, каждая по 12 байт, 12*36=432.

Чтобы Вам подсказали, как сделать лучше, расскажите о решаемой задаче. Как часто и насколько файл меняется, все ли каждый раз нужно из него читать, постоянно ли от строки к строке число непустых ячеек, все ли ячейки содержат только целые числа. Может быть, 9 минут нужно потратить один раз в неделю и это вовсе не много - тогда и менять ничего не надо.

А вообще, с точки зрения "куда идти, чтобы было быстрее" - магистральное направление: объявить структуру, 57 полей которой соответствуют целым значениям, и использовать ее как для записи, так и для чтения (файл - бинарный). Тогда 78 Мб будут считываться быстрее, чем за секунду, с диска сразу в память, без разделителей и строковых представлений. Для отладки сохранить вывод и в .csv тоже. По размеру файла сразу будет определяться число элементов в массиве этих структур.

 
Vladimir:

400 Мб это 36 млн. ячеек с пустыми строками, каждая по 12 байт, 12*36=432.

Математика ясна.

Vladimir:

Чтобы Вам подсказали, как сделать лучше, расскажите о решаемой задаче. Как часто и насколько файл меняется, все ли каждый раз нужно из него читать, постоянно ли от строки к строке число непустых ячеек, все ли ячейки содержат только целые числа. Может быть, 9 минут нужно потратить один раз в неделю и это вовсе не много - тогда и менять ничего не надо.

Задача универсальна, это чтение файлов в формате CSV, так-как данный формат универсален для разных программ, которые сейчас мне дают данные. Если конкретно про этот скрипт, то да, как раз нужно все прочесть и посчитать так-как эксель падает от формул. Ячейки могут содержать не целые числа (не конкретно в этом примере). 9 минут это не много, если это раз в неделю... однако, в том числе, мне нужно работать с таким объемом данных через оптимизатор, передавая файл на сторону и там проводя его обработку при помощи агентов, потом получать результат в формате csv (тут уже конечно можно и в другом формате) и проводить опять обработку. Поэтому я и решил публично обсудить эту проблему, так-как у меня в планах обработка больших массивов данных с применением MT5.

Vladimir:

А вообще, с точки зрения "куда идти, чтобы было быстрее" - магистральное направление: объявить структуру, 57 полей которой соответствуют целым значениям, и использовать ее как для записи, так и для чтения (файл - бинарный). Тогда 78 Мб будут считываться быстрее, чем за секунду, с диска сразу в память, без разделителей и строковых представлений. Для отладки сохранить вывод и в .csv тоже. По размеру файла сразу будет определяться число элементов в массиве этих структур.

Даже не представляю, как это можно сделать? Или речь о том, что и изначальный файл должен генерироваться по особым условиям? Тогда может можно сделать конвертор из CSV в бинарный формат?

Можете глянуть и второй класс, как научить его записывать неограниченно число столбцов?

 
Maxim Dmitrievsky:

WriteArray / Read работают быстро, макс. размер доходил до 300 мб, все оч быстро происходит, оперативку не жрет

че там кода столько для чтения\записи то, в 4 строчки все делается

Можете продемонстрировать, как это сделать?

 
Maxim Dmitrievsky:

ну так пусть определится откуда он его берет

тоже можно как массив читать, наверное

CSV универсальный файловый формат, поддержка которого есть во разном софте, в том числе связанным с МО.

Кроме того, это удобный файл для передачи данных между разными программами(скрипты/советники) MT5, и занимает он не много места.

 
Aleksey Vyazmikin:

Можете продемонстрировать, как это сделать?

попробуйте прочесть свой файл так 

https://www.mql5.com/ru/docs/files/filereadarray

мне щас вломы терминал открывать, мб завтра )

Документация по MQL5: Файловые операции / FileReadArray
Документация по MQL5: Файловые операции / FileReadArray
  • www.mql5.com
//| Структура для хранения данных о ценах                            | //| Script program start function                                    |