1. Изменение в модуле PgServices.pas, которое Вы привели, не является решением проблемы с созданием бэкапа. Более того, оно делает файл бэкапа неприменимым для восстановления. Если установить параметр Quote метода TPgTextConverter.ValueToText в значение False для BYTEA-полей, то в файле бэкапа содержимое таких полей не заключается в кавычки, т.е. было:
Код: Выделить всё
INSERT INTO test(id, bytea_field) VALUES ('1', '\\001\\014\\000\\004\\010...');
Код: Выделить всё
INSERT INTO test(id, bytea_field) VALUES ('1', \\001\\014\\000\\004\\010...);
2. Проблема с "Out of memory" при бэкапе\восстановлении BYTEA-полей связана с форматом их представления в INSERT-выражении:
- если используется PostgreSQL версии ниже 9.0, то для представления содержимого BYTEA-поля используется bytea escape-формат ( http://www.postgresql.org/docs/9.0/stat ... inary.html )
- очевидно, что в таком случае длина результирующей строки в INSERT-выражении может получиться в 5 раз больше размера данных BYTEA-поля. Оперирование строками очень больших размеров и вызывает "Out of memory", что связано с ограничениями ресурсов операционной системы.
До сих пор мы не получали жалоб от пользователей по поводу данной проблемы. Если Вам необходимо выполнять бэкап\восстановление BYTEA-полей очень больших размеров, Вы можете проголосовать за эту функциональность на нашей UserVoice странице: http://devart.uservoice.com/forums/1046 ... postgresql . Предложения с большим количеством голосов будут реализованы быстрее.