OneScript icon indicating copy to clipboard operation
OneScript copied to clipboard

Двоичные данные сразу считывают данные из файла

Open dmpas opened this issue 8 years ago • 13 comments

Большой файл на диске сразу считывается в память, а не должен. Ибо в памяти он, скорее всего, не нужен, а нужен лишь для передачи куда-то дальше.

dmpas avatar Nov 23 '17 07:11 dmpas

Насколько я знаю, 1С именно так и делает. Сразу после создания ДвДанных файл можно грохать.

EvilBeaver avatar Nov 23 '17 09:11 EvilBeaver

Синтакс-помощник:

Создает объект и помещает в него двоичные данные, взятые из файла.

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

EvilBeaver avatar Nov 23 '17 09:11 EvilBeaver

Я взял двухсполовинойгиговый файл и скормил его 32-битной 1с-ке. После вызова конструктора объём занятой оперативы не изменился. После XmlСтрока - вылет с нехваткой памяти после того, как процесс скушал 2 гига.

dmpas avatar Nov 23 '17 09:11 dmpas

Видимо, в логике 1с тоже есть некоторый порог "память - файл"

dmpas avatar Nov 23 '17 09:11 dmpas

@dmpas Конструктор шустро отработал, в темпе нового файлика не появилось гигов на 2.5 где то?

Stepa86 avatar Nov 23 '17 09:11 Stepa86

@Stepa86 так и есть! Он тупо скопировался в темпы! @EvilBeaver Вот и ответ, почему грохать его безопасно :)

dmpas avatar Nov 23 '17 10:11 dmpas

Ок, а что мы делаем тогда?

EvilBeaver avatar Nov 23 '17 11:11 EvilBeaver

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

dmpas avatar Nov 23 '17 11:11 dmpas

2 Гб быстро скопировалось - не верю :) Возможно, для 1С это привычно, т.к. там других тормозов полно. а вот для скриптов копирование в темп будет достаточно долгим

artbear avatar Nov 23 '17 11:11 artbear

2 Гб быстро скопировалось - не верю :)

SSD? фоновые дисковые операции?

dmpas avatar Nov 23 '17 11:11 dmpas

Все равно не мгновенно.

artbear avatar Nov 23 '17 11:11 artbear

Для совместимости с 1С: файл можно грохнуть сразу после создания двоичных данных Для экономии памяти: можно кидать исключения, если файл слишком большой, а для больших файлов чо нить потоковое использовать

Stepa86 avatar Nov 23 '17 11:11 Stepa86

Можно инкапсулировать логику в зависимости от размера. Скажем, лимит 200Мб. Все что меньше - тащим в память, все что больше - копируем в tmp и открываем этот файл (чтобы никто не удалил безпалева)

Далее - смотря что делается с двоичными данными. Если вызван метод получения массива, то хочешь-не хочешь, придется в память поднять. А если вызывается Записать(Путь), то работаем соответственно используемому "хранению" - из памяти или с диска.

При финализации - стирать временный файл.

EvilBeaver avatar Nov 23 '17 14:11 EvilBeaver