OneScript
OneScript copied to clipboard
Двоичные данные сразу считывают данные из файла
Большой файл на диске сразу считывается в память, а не должен. Ибо в памяти он, скорее всего, не нужен, а нужен лишь для передачи куда-то дальше.
Насколько я знаю, 1С именно так и делает. Сразу после создания ДвДанных файл можно грохать.
Синтакс-помощник:
Создает объект и помещает в него двоичные данные, взятые из файла.
т.е. явное копирование в момент конструирования. Никаких уточнений. Плюс личный опыт показывает, что грохать файл сразу после создания ДД - безопасно.
Я взял двухсполовинойгиговый файл и скормил его 32-битной 1с-ке. После вызова конструктора объём занятой оперативы не изменился. После XmlСтрока - вылет с нехваткой памяти после того, как процесс скушал 2 гига.
Видимо, в логике 1с тоже есть некоторый порог "память - файл"
@dmpas Конструктор шустро отработал, в темпе нового файлика не появилось гигов на 2.5 где то?
@Stepa86 так и есть! Он тупо скопировался в темпы! @EvilBeaver Вот и ответ, почему грохать его безопасно :)
Ок, а что мы делаем тогда?
Если хотим стопроцентной совместимости - копируем файл в темпы. Если делаем просто и надёжно - тупо открываем указанный файл для чтения или тащим его в память, если он маленький.
2 Гб быстро скопировалось - не верю :) Возможно, для 1С это привычно, т.к. там других тормозов полно. а вот для скриптов копирование в темп будет достаточно долгим
2 Гб быстро скопировалось - не верю :)
SSD? фоновые дисковые операции?
Все равно не мгновенно.
Для совместимости с 1С: файл можно грохнуть сразу после создания двоичных данных Для экономии памяти: можно кидать исключения, если файл слишком большой, а для больших файлов чо нить потоковое использовать
Можно инкапсулировать логику в зависимости от размера. Скажем, лимит 200Мб. Все что меньше - тащим в память, все что больше - копируем в tmp и открываем этот файл (чтобы никто не удалил безпалева)
Далее - смотря что делается с двоичными данными. Если вызван метод получения массива, то хочешь-не хочешь, придется в память поднять. А если вызывается Записать(Путь), то работаем соответственно используемому "хранению" - из памяти или с диска.
При финализации - стирать временный файл.