Hi all,
Please I have an issue with generating multiple sales invoice files, slightly over 3000 for now but will grow overtime, zip and save on the system. It is set as a recurrent task (daily actually). The problem is after it generates about 1000, it gives “OSError: [Errno 12] Cannot allocate memory”. It’s hosted on AWS.
tasks.py
`
def save_all_invoices():
all_sales_invoices = frappe.get_all("Sales Invoice", fields=["*"])
for sales_invoice in all_sales_invoices:
customer = frappe.get_doc('Customer', sales_invoice.customer)
customer_email = frappe.db.get_value('Contact',{'customer':customer.name},'email_id')
sorted_stages = utils.get_all_sorted_reminder_stages(customer.estate)
if not sorted_stages:continue #Stages not set for company
reminder_stage = get_stage_to_notify_customer(customer_email,sales_invoice,sorted_stages)
if not reminder_stage:continue
# Save each Sales Invoice
fm.save_sales_invoice_and_reminder_stage(sales_invoice,reminder_stage.print_format)
fm.create_zip_file_for_all_sales_invoices()
`
file_manager.py
def save_sales_invoice_and_reminder_stage(sales_invoice,reminder_stage_name):
# DEBUG CODE
# sales_invoice = frappe.get_doc("Sales Invoice","SINV-00001")
# reminder_stage = frappe.get_doc("Payment Reminder Stage","2ec4b5c8af")
# ************
customer_name = sales_invoice.customer_name
customer_name = customer_name.replace("/","-")
year = sales_invoice.due_date.year
month = sales_invoice.due_date.strftime('%B')
company = frappe.get_doc("Company",sales_invoice.company)
zip_file_name = frappe.scrub("{0}_{1}_{2}_{3}.zip".format(company.abbr,month,year,
reminder_stage_name))
pdf_file_name = frappe.scrub("{0}_{1}_{2}_{3}.pdf".format(customer_name,month,year,
reminder_stage_name))
# This is where the error occurs
pdf_file_content = frappe.get_print(doctype="Sales Invoice", name=sales_invoice.name,
print_format=reminder_stage_name,as_pdf=True, doc=None)
folders = [SALES_INVOICE_BASE,str(year),str(month),str(reminder_stage_name)]
folder_tree = create_folder_tree(folders)
if not folder_tree['folder_is_available']:
frappe.log_error(_("""{0} not found in site's private files,
{1} was not saved as a file!!""".format(folder_tree['folder_path'],sales_invoice.name)))
return
try:
file_available = frappe.get_doc('File',{'file_name':pdf_file_name,
'folder':folder_tree['folder_path']})
# Constantly update file
if not pdf_file_content.strip() == '':
remove_file(file_available.name, attached_to_doctype="Sales Invoice",
attached_to_name=sales_invoice.name)
# delete_file_from_filesystem(file_available)
else:
return
except DoesNotExistError as e:
pass
tmp_file = save_file(pdf_file_name,pdf_file_content,"Sales Invoice",sales_invoice.name,
folder=folder_tree['folder_path'],is_private=1)
`
Stack Trace
File "/home/ubuntu/frappe-bench/apps/estate_manager/estate_manager/tasks.py", line 152, in remind_all_customers_of_payment fm.save_sales_invoice_and_reminder_stage(sales_invoice,reminder_stage) File "/home/ubuntu/frappe-bench/apps/estate_manager/estate_manager/file_manager.py", line 64, in save_sales_invoice_and_reminder_stage print_format=reminder_stage.print_format,as_pdf=True, doc=None) File "/home/ubuntu/frappe-bench/apps/frappe/frappe/__init__.py", line 1183, in get_print return get_pdf(html, output = output) File "/home/ubuntu/frappe-bench/apps/frappe/frappe/utils/pdf.py", line 17, in get_pdf pdfkit.from_string(html, fname, options=options or {}) File "/home/ubuntu/frappe-bench/env/src/pdfkit/pdfkit/api.py", line 66, in from_string configuration=configuration) File "/home/ubuntu/frappe-bench/env/src/pdfkit/pdfkit/pdfkit.py", line 38, in __init__ self.configuration = (Configuration() if configuration is None File "/home/ubuntu/frappe-bench/env/src/pdfkit/pdfkit/configuration.py", line 18, in __init__ ['which', 'wkhtmltopdf'], stdout=subprocess.PIPE).communicate()[0].strip() File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1223, in _execute_child self.pid = os.fork() OSError: [Errno 12] Cannot allocate memory
Please help!
Thanks.