Demora al importar un archivo CSV

Un saludo para todos, quería exponer mi caso para ver si alguien me puede colaborar o si ha vivido la misma experiencia y me pueda aconsejar sobre que deba hacer.

Sucede que tengo un archivo (plantilla) csv con más de 70 mil líneas para importar en un asiento contable, pero mi gran dolor de cabeza surge cuando lo dejo importando ya que la espera para la finalización de este proceso es mucha, al hacerlo desde el cliente gtk llega a un momento donde el cliente se detiene por un error de ‘time out’, entonces opto por hacerlo desde el navegador pero he llegado a esperar todo el día y nada que termina. Estuve intentando crear un asistente que realice la tarea para almacenar los archivos con la función ‘create’ pero no logro mejora alguna.

De ante mano agradezco a las personas que me puedan colaborar con este asunto

Posdata: sospecho que el problema puede estar en alguna mala configuración del servidor.

Hola Cristian,

El tiempo de carga depende del número de campos que estes importando y como hayas definido el CSV. Supongo que estas cargando a la vez asientos y apuntes y esto puede ser que demore.
Seguramente el problema es que la importación de CSV esta haciendo muchas consultas para encontrar los valores relacionales del CSV.

Dado el volumen de datos que tienes te recomiendo hacer un script en proteus para cargar esa información ya que lo puedes optimizar mucho mas. Lo idea es cargar todas las relaciones al principio y luego asignar directamente el id en la creación para evitar tener que hacer muchas consultas.

Aqui puedes ver un script sobre como importar apuntes contables de forma mas eficiente.

Siguiendo las instrucciones cree el siguiente script en proteus:

Move = Model.get('account.move')
Line = Model.get('account.move.line')
Party = Model.get('party.party')
Account = Model.get('account.account')

move, = Move.find([('number', '=', 'ASI-000004')])

with open('2022-01.csv', 'r') as archivo:
    lineas = archivo.readlines()
    vlist = []
    for linea in lineas:
        if not linea:
            continue
        print(linea)
        linea = linea.split(';')
        account_line = linea[4].strip()
        debit_line = linea[5].strip()
        if debit_line:
            debit_line = Decimal(debit_line)
        else:
            debit_line = Decimal(0)
        credit_line = linea[6].strip()
        if credit_line:
            credit_line = Decimal(credit_line)
        else:
            credit_line = Decimal(0)
        party_line = linea[7].strip()
        description_line = linea[8].strip()
        maturity_date = linea[9].strip()
        reference_line = linea[10].strip()
        account, = Account.find([('code', '=', account_line)])
        line = {
            'move': move.id,
            'account': account.id,
            'reference': reference_line,
            'debit': debit_line,
            'credit': credit_line,
            'description': description_line,
        }
        # if maturity_date:
        #     line['maturity_date'] = cls.convert_str_date(maturity_date)
        if account.party_required:
            party = Party.find([('id_number', '=', party_line)])
            if party:
                line['party'] = party[0].id
            else:
                line['party'] = Party(1).id
        vlist.append(line)
        if len(vlist) > 1000:
            Line.create(vlist, Line._config.context)
            vlist.clear()
    if vlist:
        Line.create(vlist, Line._config.context)

Aún con este cambio el proceso demora demasiado tiempo, entiendo que son muchas las líneas pero quisiéramos que el proceso no se llevara todo el día. ¿Alguna otra sugerencia?

Para mi el problema es que estas haciendo un Party.find y un Account.find dentro del bucle for cosa que hace que se ejecuten 2 consultas para cada uno de los registros cosa que hace que el proceso demore mucho mas.

Te recomiendo que hagas una busqueda de todos las cuentas y todos los terceros antes de empezar el for y te lo guardes en un diccionario donde la clave es el campo que utilizas para buscar cada uno de los valores. De esta forma dentro de tu bucle debes acceder directamente al diccionario cosa que hara que la importación sea bastanta mas rapida.

Realice el cambio de las consultas y me mejoró un poco la velocidad pero el problema persiste al momento de ejecutar la función ‘create’. Allí es donde la espera se hace casi eterna.

Hola Christian,

La verdad que es extraño, crear 1000 registros no deberia demorar mucho.
Habria que revisar si tienes algun código personalizado o alguna cosa que ralentice la creación de los datos.

You should check that you are using a version with Issue 11027: Use SQL query to validate balanced move - Tryton issue tracker

Estaba trabajando con la versión 6.0.3 del módulo account por ende me tocó actualizar el módulo a la versión 6.0.13 para verificar si allí estaba incluido el [Issue 11027: Use SQL query to validate balanced move - Tryton issue tracker] como en esa versión no esta incluido, lo que hice fue copiar la solución directamente al código fuente, mientras actualizamos el core de Tryton junto con sus módulos y de esta forma solucionamos el problema notando la mejora al crear 7k líneas en 2 minutos.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.