Недостаточно памяти для записи файла формата base64
проверить Диспетчер задач показывает, что есть много свободной памяти. Закрытие других открытых программ не имеет значения.
это происходит спорадически и при разных обстоятельствах: иногда при сохранении дизайна формы или изменения кода VBA, иногда, когда несколько форм открыты и используются.
при попытке сохранить изменения дизайна, и эта ошибка возникает, объекты доступа повреждены и не могут быть восстановлены.
любые предложения о том, что может быть причиной этого, будут очень приветствоваться.
проект VBA в вашем интерфейсе, вероятно, поврежден. Вам нужно перестроить его с нуля, а затем использовать правильные методы кодирования доступа:
в параметрах VBE отключите компиляцию по требованию (см. статья Майкла Каплана о декомпиляции подробности почему).
в параметрах VBE включите требование объявления переменной.
в VBE настройте панель инструментов так, чтобы кнопка компиляции была легко доступный (он находится в меню Debug). Я также рекомендую добавить кнопку стека вызовов (из меню Вид), так как это удобно для отладки ошибок в режиме перерыва. Дело в том, чтобы сделать отладку и компиляцию как можно проще.
отныне при программировании компилируйте часто, через каждые две-три строки кода. Я, вероятно, компилирую свой проект 100 или более раз в день при кодировании.
периодически декомпилируйте свой проект и компактируйте и перекомпилируйте его. Это очистит любой crud, который накапливается во время регулярного развития.
эти методы гарантируют, что код в неповрежденном проекте остается в чистом состоянии по возможности. Он ничего не сделает для восстановления уже поврежденного проекта.
Что касается того, как перестроить проект, я думаю, что я бы пошел по радикальному пути экспорта всех объектов с приложением.SaveAsText и импорт их в новую пустую базу данных с приложением.LoadFromText. Это превосходит простой импорт из существующего поврежденного интерфейса, поскольку импорт может импортировать поврежденные структуры, которые не переживут цикл SaveAsText/LoadFromText.
I программа ежедневно в доступе, работает с нетривиальными приложениями, которые используют много кода, включая множество автономных модулей класса. Я не потерял объект для коррупции кода более 5 лет, и это было еще в тот день, когда я все еще использовал A97.
наткнувшись на этот мой старый пост, и видя, что у него был изрядный интерес, я подумал, что, может быть, обновление будет в порядке?
Итак, 2 года вниз по дорожке, делая много работы приложения 2007 года, а также более старые приложения 2003 (и даже '97), я нахожу, что 2007 менее подвержен действительно неприятным сбоям, чем 2003 - где определения объектов доступа (формы и отчеты esp.) будет легко поврежден.
Я по-прежнему следую предложениям 1-6 (выше) Дэвида-W-Fenton религиозно, хотя, плюс использование приложения.SaveAsText (см. предложение Тони Toews и ссылку выше).
в эти дни, будь то 97, 2003 или 2007 я работаю, если доступ дает любой намек на "странный | авария | бросая непонятные ошибки" etc, я делаю следующее:
- сразу закрыть приложение Access
- резервное копирование файла mdb / accdb
- откройте приложение удерживая [Shift] , так что ничего не работает
- экспорт всех объектов в виде текста с помощью приложения.SaveAsText (как еще одна резервная копия)
- закройте и снова откройте приложение с помощью переключателя / decompile
- перекомпилировать код VBA
- сделайте компакт / ремонт.
Это не решает все, но это значительно уменьшает количество искажений объектов доступа от того, что я могу наблюдать.
Я работала в магазине много лет, что б доступ к их платформе. Приложение в конечном итоге стало настолько большим, что оно начало поражать внутреннее ограничение памяти Access 2003. Они начали испытывать ту же самую проблему, что и вы. Как вы заметили, нет никаких внешних признаков проблем с памятью, когда это произойдет.
компания долго говорила с Microsoft о проблеме, и я считаю, что Microsoft в конце концов снабдил их заплаткой. Таким образом, вы можете поговорить с Microsoft об этом, если это звучит как аналогичная ситуация с тем, что вы испытываете, поскольку они могут предоставить вам тот же патч.
в конечном счете долгосрочное решение состоит в том, чтобы разбить приложение на более мелкие части. Переход на Access 2007 не помог; на самом деле, это ухудшило ситуацию, потому что Access 2007 имеет больше движущихся частей.
быстрое решение; гарантированный для работы:
открыть VBA ( Alt-F11 ) В окне непосредственно введите следующее:
вот и все :) надеюсь, это поможет другим!
вы работаете над этим MDB по сети? Это единственное, что я могу придумать, что может вызвать эту проблему.
поскольку я знаю, что это либо формы, либо отчеты, которые, скорее всего, будут повреждены, я создал новый mdb, и только импортированные таблицы (прикрепленные), запросы, скрипты (только один), модули и меню. Затем я использовал LoadFromText для импорта форм и отчетов через функцию, а затем сделал обычную декомпиляцию/компиляцию и компакт/ремонт и т. д.
до сих пор, прикоснитесь к дереву, у меня не было другой аварии в течение нескольких дней, поэтому я, вероятно, буду придерживаться этого метода восстановления.
большое спасибо всем за свои предложения.
Я сталкивался с этой проблемой много раз и, наконец, нашел решение, которое сработало. Я не знаю, что вызывает проблему, но я знаю, как ее решить.
обычно эта ошибка возникает при открытии формы. Что вам нужно сделать, это полностью воссоздать эту форму. Самый простой способ сделать это-сначала экспортировать форму в текстовый файл с помощью приложения недокументированной функции.SaveAsText. Затем вы удаляете форму из своей базы данных и повторно загружаете ее Приложение.LoadFromText.
Задача: Подключить 5 справочников и документ (самописных) в подсистему версионирования БСП.
2) Выполнили все необходимые действия:
2.1) В определяемые типы поместили все необходимые справочники и документ "СправочникСсылка.*, Документ.Ссылка.*"
2.2) В подписку на событие "ЗаписатьВерсиюОбъекта" / "ПередЗаписью" - поместили справочники
2.3) В подписку на событие "ЗаписатьВерсиюДокумента" / "ПередЗаписью" - поместили документ
2.4) В регистре "Настройки версионирования объектов" - активируем версионирование для новых Справочников и Документа.
Результат:
- Для документа версии создаются: работает !
- Для справочников отрабатывает только для самого маленького с одним реквизитом. (что и натолкнуло на причину): Не работает !
Выпадает ошибка при записи версии:
"Недостаточно памяти для записи файла формата Base 64"
Изучаем аналогичные проблемы:
- очистки кэша, регистра "Версии объектов", смена платформы: не помогают!
- решение везде одинаковое: отключить либо все объекты от версионирования - либо часть методом последовательного исключения проблемных.
* ниже обсуждение данной ошибки в УПП, УТ11, Документооборот, Розница.
Исследование:
- Ошибка возникала на больших справочниках, поэтому взял справочник для которого версионирование отработало.
- Добавляя по 10 реквизитов проверял работоспособность версионирования
- После добавления 50 реквизитов возникла наша ошибка.
Итого:
- Для использования версионирование нужно либо увеличивать мощность железа, либо включать в версионирование относительно небольшие объекты.
1. У кого возникала аналогичная ошибка и ваши пути решения?
2. Платформенная ли это ошибка или БСП? (чтобы грамотно озвучить этот вопрос на партнерском форуме)
3. Признавалась ли данная ошибка в платформе фирмой 1С и номер ошибки? (если кто сталкивался)
Проблема локализована, решение проблемы не найдено - попробуем выяснить причины и решение проблемы.
Настройка и сопровождение 1С запись закреплена
Если возникает ошибка «Недостаточно памяти для записи файла формата Base64»
В определенный момент 1С может показать такую ошибку. Скорее всего, у вас клиент-серверная модель, и причина в настройках сервера 1С. Попытаемся разобраться, в чём дело.
Быстрый способ — перезапуск службы «Агент сервера 1С:Предприятия 8.3». Но это, как понимаете, не панацея.
С учетом многопользовательской работы, не всегда так просто взять и перезагрузить сервер 1С.
Среди возможных причин:
1. Ошибка платформы. Вариант один — ждать исправления в новом релизе. Проверить после обновления.
2. Память сервера. Проверьте распределение ОЗУ для серверной ОС с пользователями, служб сервера 1С и СУБД — ограничьте максимальное значение для MS SQL.
3. Разрядность сервера 1С. Если используете x32-платформу, задумайтесь о переходе на x64, где рабочим процессами выделяется больше адресного пространства.
4. Версионирование. Протестируйте работу 1С при отключении версионирования.
5. Настройки сервера 1С. Увеличьте значение «Безопасный расход памяти за один вызов», если задано нетиповое значение. Либо установите «Количество ИБ на процесс» = 1 (по умолчанию — 8).
6. Файл лога. Проверьте размер lgd-файла 1Cv8. Возможно, что он существенно увеличен и требует архивации или очистки.
Практика показывает, что каждый случай — уникальный и требует детального рассмотрения. Стандартный арсенал способов изучения и «борьбы» с данной ошибкой у вас на руках. Успехов вам, и стабильной работы 1С.
Ошибка «Недостаточно памяти» в 1С 8.3 и 8.2 является не такой уж и редкой. Ее можно встретить и в конфигураторе (например, при сравнении конфигураций), а так же в режиме «1С:Предприятие» при выполнении трудоемких обработок: например при записи большого файла формата base64.
Данная ошибка может встречаться не только в программе 1С, но и в других программах операционной системы Windows.
Все дело в том, что в 32-х разрядных операционных системах по умолчанию 2 ГигаБайта на различные программы и столько же для операционной системы. В 64-х разрядных ОС выделяемый на приложения объем памяти составляет уже 4 ГигаБайта.
Следуя из вышесказанного, вам необходимо увеличить размер выделяемой адресной памяти на приложения, коим является программа 1С. Сделать это можно двумя способами: осуществить переход с 32-х разрядной системы на 64-х разрядную, или увеличить выделяемое изначально количество адресной памяти.
Конечно же, первый способ лучше и предпочтительнее, но если в данный момент, либо вообще вы не можете им воспользоваться, то можете воспользоваться вторым.
Дня начала перейдите в командную строку операционной системы. Для этого перейдите в меню «Пуск» и вверите в строке поиска «cmd».
Перед вами отобразится поиск программ. Выберите ту, что называется «cmd».
Так же командную строку можно открыть при помощи комбинации горячих клавиш Windows + R.
В открывшемся окне наберите следующую команду и так же нажмите «Enter»:
bcdedit /set increaseuserva 3200
Получите понятные самоучители по 1С бесплатно:
В данном случае вы увеличите объем адресной памяти до 3200 МегаБайт.
Далее перезагрузите компьютер и попробуйте выполнить в программе те же самые действия, на которых раньше выдавалась ошибка.
После того, как у вас все получилось, настоятельно рекомендуется восстановить прежний объем адресной памяти. Данная мера временная, так как при выделении памяти на приложения, у операционной системы ее становится меньше. За счет этого возможно нарушение стабильности Windows.
Для восстановления адресной памяти в значение по умолчанию можно воспользоваться следующей командной, которая так же вводится в командной строке:
bcdedit /deletevalue increaseuserva
Обратите внимание, что при часто встречающийся ошибке «Нехватка памяти» в 1С так же может помочь удаление помеченных объектов. Возможно, в программе их накопилось очень много и программе сложно обрабатывать такие объемы данных. Если и этот способ не помог, то вам следует увеличить разрядность операционной системы Windows.
Подпишитесь на наш YouTube канал
В XP не работает данная команда
Для Windows XP/2003 – добавлением ключа /3GB в файле Boot.ini
Только загугли как это правильно сделать, чтобы не угробить загрузку системы)
А если система и так х64? х128 Вроде пока не выпустили:) И что делать тогда?
А это что то меняет? Распределение памяти работает аналогично как я понял, так что спокойно увеличивай объём, который выделяется для приложений используя метод приведённый выше.
Из 5 рабочих мест такая ошибка вылезала только на одном, хотя оно ничем особо не отличалось от остальных. Все рабочие места на WinXP, файловая база в сетевой папке (около 7 гб).
Причем в момент возникновения ошибки в диспетчере задач показывалось, что занятой памяти на ПК 1.2 гб и свободной еще 2 гб.
Вылечилось очень неожиданным способом. ПК с 4 гб памяти и интегрированным видео Intel. Зашел в БИОС, выставил видеоадаптер iGPU (было Авто), размер видеопамяти 64 мб (было Авто).
Всё, проблема решилась, в 1С перестала вылезать ошибка о нехватке памяти. Даже /3GB в boot.ini не стоит (/userva тоже отсутствует). Да и количество занятой и свободной памяти в диспетчере задач как бы намекает, что в данном случае эти опции ничего не изменят.
Видимо, объем видеопамяти в режиме Авто, равный вроде 512 мб, занимает большой диапазон в зарезервированном адресном пространстве (выше 3.34 гб, того объема памяти, который показывается в Windows, но ниже 4гб). Остальные устройства тоже занимают какие-то адреса в этом пространстве, и, возможно, пересекаются с адресами реальной памяти. То есть система пытается выделить блок памяти близко к 3.34 гб и получает облом (т.к. по этому адресу оказывается память какого-нибудь устройства). В результате в 1С вылазит ошибка.
А когда видеопамяти всего 64 мб, остального пространства адресов хватает, чтобы разместились адреса всех устройств, и они не пересекаются с реальной памятью. Соответственно, к каким бы ячейкам памяти из имеющихся в Windows 3.34 гб ни обратилась программа, все сработает нормально, никаких ошибок не будет.
Я делаю небольшое приложение для мобильного устройства.
вы не можете просто загрузить весь файл в память, как здесь:
вместо этого загрузите файл по частям и Закодируйте его по частям. Base64-это простая кодировка, достаточно загрузить 3 байта и закодировать их за раз (это даст 4 байта после кодирования). По соображениям производительности рассмотрите загрузку кратных 3 байт, например 3000 байт-должно быть просто отлично. Также рассмотрите буферизацию входного файла.
обратите внимание, что вы не можете просто добавить результаты Base64.encodeBase64() до encoded массив bbyte. На самом деле он не загружает файл, а кодирует его в Base64, вызывая проблему нехватки памяти. Это понятно, потому что версия Base64 больше (и у вас уже есть файл, занимающий много памяти).
подумайте об изменении вашего метода на:
и отправка данных в кодировке Base64 непосредственно в base64OutputStream вместо того, чтобы вернуть его.
обновление: благодаря @StephenC я разработал гораздо более легкую версию:
он использует Base64OutputStream это переводит входные данные в Base64 на ходу и IOUtils класс Apache Commons IO.
Примечание: Вы должны закрыть FileInputStream и Base64OutputStream явно не для печати = если требуется, но буферизация обрабатывается IOUtils.copy() .
либо файл слишком большой, либо ваша куча слишком мала, либо у вас утечка памяти.
Если это происходит только с действительно большими файлами, поместите что-то в свой код, чтобы проверить размер файла и отклонить файлы, которые необоснованно велики.
Если это происходит с небольшими файлами, увеличьте размер кучи, используя параметр командной строки-Xmx при запуске JVM. (Если это находится в веб-контейнере или какой-либо другой структуре, проверьте документацию о том, как это сделать.)
Если файл повторяется, особенно с небольшими файлами, есть вероятность, что у вас есть утечка памяти.
другой момент, который следует сделать, заключается в том, что ваш текущий подход влечет за собой хранение двух полных копий файла в памяти. Вы должны иметь возможность уменьшить использование памяти, хотя для этого обычно требуется потоковый кодировщик Base64. (Это зависит от того, какой аромат base64 кодирование, которое вы используете . )
на этой странице описывает потоковую библиотеку кодировщика / декодера Base64 и включает lnks для некоторых альтернатив.
Ну, не делайте этого для всего файла сразу.
Base64 работает одновременно на 3 байтах, поэтому вы можете читать файл партиями" кратных 3 " байтов, кодировать их и повторять, пока не закончите файл:
вы не читаете весь файл, только первые несколько КБ. The read метод возвращает количество фактически прочитанных байтов. Вы должны позвонить read в цикле, пока он не вернется -1 чтобы быть уверенным, что вы прочитали все.
файл слишком велик для него и его кодировки base64, чтобы поместиться в памяти. Либо
увеличение памяти, доступной для JVM с -Xmx переключатель, например,
Это лучший код для загрузки изображения большего размера
Ну, похоже, ваш файл слишком велик, чтобы одновременно хранить несколько копий, необходимых для кодирования в памяти Base64 в доступной памяти кучи. Учитывая, что это для мобильного устройства, вероятно, невозможно увеличить кучу, поэтому у вас есть два варианта:
- сделайте файл меньше (намного меньше)
- сделайте это на основе Страма, так что Вы читаете из InputStream по одной небольшой части файла за раз, Закодируйте его и запишите в OutputStream , никогда не сохраняя файл enitre в памяти.
в манифесте в теге applcation напишите следующее android: largeHeap=" true"
Читайте также: