Hi
So I was developing a module that exports every products barcode and image to an Excel, and that then returns the an Excel file. This works fine when there's just a couple pictures, but when I tried running the method on a bigger db with tons more pictures I got an error.
Here is the code that's being run:
| class ExportProductImage(models.TransientModel): | |
| _name = "export.product.image" | |
| _description = "Export product image" | |
| datas = fields.Binary('File', readonly=True) | |
| datas_fname = fields.Char('Filename', readonly=True) | |
| def generate_excel_product_image(self): | |
| filename = 'product_images' | |
| fp = BytesIO() | |
| book = xlsxwriter.Workbook(fp) | |
| sheet1 = book.add_worksheet("Afbeeldingen") | |
| sheet1.set_landscape() | |
| sheet1.set_default_row(230) | |
| sheet1.set_column('B:B', 73) | |
| sheet1.set_row(0, 20) | |
| sheet1.write('A1', 'Barcode') | |
| sheet1.write('B1', 'Afbeelding') | |
| product_templates = self.env['product.template'].search([]) # image_1920 | |
| row = 2 | |
| for temp in product_templates: | |
| if temp.image_1024: | |
| sheet1.write('A'+str(row), "'" + str(temp.barcode)) | |
| image = BytesIO(base64.b64decode(temp.image_1024)) | |
| sheet1.insert_image('B' + str(row), "img" + str(row), {'x_scale': 0.5, 'y_scale': 0.5, 'image_data': image, 'object_position': 1}) | |
| row += 1 | |
| book.close() | |
| out = base64.encodestring(fp.getvalue()) | |
| self.write({'datas': out, 'datas_fname': filename}) | |
| fp.close() | |
| filename += '%2Exlsx' | |
| return { | |
| 'type': 'ir.actions.act_url', | |
| 'target': 'new', | |
| 'url': 'web/content/?model=' + self._name + '&id=' + str( | |
| self.id) + '&field=datas&download=true&filename=' + filename, | |
| } |
Here is the traceback:
Fout:
Odoo Server Error
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/sql_db.py", line 225, in execute
res = self._obj.execute(query, params)
psycopg2.OperationalError: cannot allocate memory for output buffer
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/loglevels.py", line 92, in ustr
return text_type(value)
MemoryError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/http.py", line 656, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 314, in _handle_exception
raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
File "/usr/lib/python3/dist-packages/odoo/tools/pycompat.py", line 87, in reraise
raise value
File "/usr/lib/python3/dist-packages/odoo/http.py", line 698, in dispatch
result = self._call_function(**self.params)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 346, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 97, in wrapper
return f(dbname, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 339, in checked_call
result = self.endpoint(*a, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 941, in __call__
return self.method(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 519, in response_wrap
response = f(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 966, in call_button
action = self._call_kw(model, method, args, {})
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 954, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 759, in call_kw
return _call_kw_multi(method, model, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 746, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "/mnt/repo/custom/report_stock_wizard/wizard/export_image.py", line 42, in generate_excel_product_image
self.write({'datas': out, 'datas_fname': filename})
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3324, in write
self._write(store_vals)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3417, in _write
cr.execute(query, params + [sub_ids])
File "/usr/lib/python3/dist-packages/odoo/sql_db.py", line 148, in wrapper
return f(self, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/sql_db.py", line 228, in execute
_logger.error("bad query: %s\nERROR: %s", ustr(self._obj.query or query), e)
File "/usr/lib/python3/dist-packages/odoo/loglevels.py", line 94, in ustr
raise UnicodeError('unable to convert %r' % (value,))
MemoryError
Anyone know how I could solve this?
For those wondering, these are in my config file:
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_request = 8192
limit_time_cpu = 120
limit_time_real = 9999
limit_time_real_cron = -1
longpolling_port = 8072
max_cron_threads = 9
workers = 0
When I put more then 0 workers, I get a bus error so that's another problem.