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

 
Vladislav Andruschenko:


я когда-то сталкивался с такой проблемой. Делал много исправлений. Всего не помню - это было разовое задание, 

но попробуйте задать здесь ArrayResize(arrRead_01,arrSize);  3 параметр


   int    reserve_size=0        // reserve size value (excess)


поэкспериментируйте. 

Спасибо, но все тормоза и поглощение памяти, судя по экспериментам, приходятся на класс для чтения информации из файла. Может там можно что-то подправить?

 
Очень бы хотелось получить помощь и по второму вопросу - ограничение на запись, кто-то решал эту проблему?
 

Судя по скорости реаллокации памяти, массивы строк хранятся как массивы объектов, а не указателей на них, отсюда тормоза. Нужно, чтобы разработчики прояснили этот вопрос, от этого зависит решение.

Потом, парсер создаёт локальный массив ячеек из строки и затем копирует их в выделенную память - лишний костыль, причём существенный.

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

 
SeriousRacoon:

Судя по скорости реаллокации памяти, массивы строк хранятся как массивы объектов, а не указателей на них, отсюда тормоза. Нужно, чтобы разработчики прояснили этот вопрос, от этого зависит решение.

Попробуем позвать разработчика, @Renat Fatkhullin - можете прояснить ситуацию?

SeriousRacoon:

Потом, парсер создаёт локальный массив ячеек из строки и затем копирует их в выделенную память - лишний костыль, причём существенный.

Как от него можно избавиться?

SeriousRacoon:

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

"Массив файловых строк" - это что Вы имеете в виду? Если это просто речь о создании массива, куда будут записаны все строки, то на сколько я понимаю, у длины строки есть ограничения по количеству символов, нет?

Класс для чтения писался сотрудником MQ, я думал, там всё грамотно написано.

Парсер правильно читает текст, тут с Вами не соглашусь - скрипт ранее приложенный это подтверждает.

 
Aleksey Vyazmikin:

Попробуем позвать разработчика, @Renat Fatkhullin - можете прояснить ситуацию?

Как от него можно избавиться?

"Массив файловых строк" - это что Вы имеете в виду? Если это просто речь о создании массива, куда будут записаны все строки, то на сколько я понимаю, у длины строки есть ограничения по количеству символов, нет?

Класс для чтения писался сотрудником MQ, я думал, там всё грамотно написано.

Парсер правильно читает текст, тут с Вами не соглашусь - скрипт ранее приложенный это подтверждает.

Он правильно читает файлы, где нет закавыченных строк, внутри которых есть символ разделителя. Попробуйте прочитать им 60;""sample;string"". На выходе должно быть 2 ячейки: [60] и [sample;string]. А будет, видимо, 3 - [60] [""sample] [string""]. (ЗЫ кроме того, в ксв допускаются переносы закавыченных строк :) )

Я знаю, как я от этого бы избавился в си или плюсах - аллокировал бы сначала массив указателей на строки и заполнял бы его, парся строчку. В мкл нет указателей, я не врублюсь, как подойти к этой задаче. Надеюсь, Ренат сможет прояснить.

"Массив файловых строк" - это что Вы имеете в виду? Если это просто речь о создании массива, куда будут записаны все строки, то на сколько я понимаю, у длины строки есть ограничения по количеству символов, нет?

В смысле, прочитать файл построчно и хранить каждую исходную строку файла в массиве, не парся её. При обращении к строке по формату (row, column) брать строку row, парсить её на лету и отдавать значение column, попутно кэшируя результат парсинга.

 

Вот ещё возможное решение. При чтении файла делать предварительный разбор - сохранять для каждой строки массив двух целых значений: индекс символа, с которого начинается значение ячейки в строке, и длина этой подстроки.

Например:

строка в файле : 54;345;12;12345
индекс символа : 0  3   7  10
длина подстроки: 2  3   2  5

Вот значения индексов и длин и сохраняем для дальнейшего разбора по требованию.
 
SeriousRacoon:

Он правильно читает файлы, где нет закавыченных строк, внутри которых есть символ разделителя. Попробуйте прочитать им 60;""sample;string"". На выходе должно быть 2 ячейки: [60] и [sample;string]. А будет, видимо, 3 - [60] [""sample] [string""]. (ЗЫ кроме того, в ксв допускаются переносы закавыченных строк :) )

А, ясно, не знал о таких тонкостях стандарта CSV. Спасибо, что просветили об особенностях!

SeriousRacoon:

Я знаю, как я от этого бы избавился в си или плюсах - аллокировал бы сначала массив указателей на строки и заполнял бы его, парся строчку. В мкл нет указателей, я не врублюсь, как подойти к этой задаче. Надеюсь, Ренат сможет прояснить.

Будем надеяться, что Ренат сможет внести ясность.

SeriousRacoon:

В смысле, прочитать файл построчно и хранить каждую исходную строку файла в массиве, не парся её. При обращении к строке по формату (row, column) брать строку row, парсить её на лету и отдавать значение column, попутно кэшируя результат парсинга.

Да, думаю это было бы оптимально по времени, даже кэш особо не нужен, наверное. Можете помочь и внести соответствующие правки в класс для реализации этого подхода?

 
SeriousRacoon:

Вот ещё возможное решение. При чтении файла делать предварительный разбор - сохранять для каждой строки массив двух целых значений: индекс символа, с которого начинается значение ячейки в строке, и длина этой подстроки.

Например:

строка в файле : 54;345;12;12345
индекс символа : 0  3   7  10
длина подстроки: 2  3   2  5

Вот значения индексов и длин и сохраняем для дальнейшего разбора по требованию.

Ну да, я примерно о таком подходе выше сегодня писал - посчитать с начала что по чем, а потом уже заполнять массив. Но не представляю, как это можно реализовать :(

 

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

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

 
Maxim Dmitrievsky:

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

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

Ооп
Причина обращения: