Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

4 votos

¿ArcPy pérdida de memoria cuando la importación de archivos CSV?

Estoy tratando de importar un gran número de archivos csv de alrededor de 250 MB cada uno. Escribí una secuencia de comandos de python para que la siguiente manera:

import gc
import glob
tables = glob.glob("C:\\Users\\emportella\\Documents\\ArcGIS\\2517")
for table in tables:
    arcpy.TableToGeodatabase_conversion(table, "C:\\Users\\emportella\\Documents\\ArcGIS\\2517\\Tables.gdb")
    gc.collect()

Funciona durante las primeras 4 a 6 archivos y sin dar ningún aviso se cierra. he prestó atención a uso de memoria en el Administrador de Tareas de Windows y el proceso de cosumes más y más memoria hasta que craches.

Ya he intentado utilizar algunos de los diferentes aproches como el uso de:

env.workspace = "C:\\Users\\emportella\\Documents\\ArcGIS\\2517\\*.csv"
tables = arcpy.ListTables()
arcpy.TableToGeodatabase_conversion(tables, "C:\\Users\\emportella\\Documents\\ArcGIS\\2517\\Tables.gdb")

El TableToGeodatabase_conversion acepta lista de tablas pero craches de la misma manera.

Así es que la pregunta es hay alguna manera de administrar la memoria utilizada en arcpy marco?

5voto

Galbrezu Puntos 142

No puedo hablar por el consumo de memoria o accidentes sin perfil. Yo te puedo ofrecer una alternativa de flujo de trabajo que funciona bastante bien para mí en arcpy 10.1 (10.1, ya que utiliza da.InsertCursors). El siguiente código está pensado para ser utilizado como una herramienta de secuencia de comandos, pero parece que usted sabe lo suficiente acerca de Python para modificar un bucle a través de los archivos de salida y únicos.

import arcpy, os, csv

infile = arcpy.GetParameterAsText(0)
outtable = arcpy.GetParameterAsText(1)

outpath = os.path.dirname(outtable)
outname = os.path.basename(outtable)

temptable = "in_memory\\tempcsv"
temppath = os.path.dirname(temptable)
tempname = os.path.basename(temptable)

if arcpy.Exists(temptable):
    arcpy.Delete_management(temptable)

arcpy.CreateTable_management(temppath, tempname)

rfile  = open(infile, 'rb')
csvreader = csv.reader(rfile)

index = 0
fieldnames = []
oidfieldnames = ["OID","FID","OBJECTID"]

for csvrow in csvreader:
        if index == 0:
                for column in csvrow:
                        if column in oidfieldnames:
                column = column + "_ORIG"
            arcpy.AddField_management(temptable, column, "TEXT")
            fieldnames.append(column)
        arcpy.CreateTable_management(outpath, outname, temptable)
        arcpy.Delete_management(temptable)
                tablerows = arcpy.da.InsertCursor(outtable, fieldnames)
        else:
                tablerows.insertRow(csvrow)
        index = index + 1

rfile.close()

5voto

auramo Puntos 161

Otro enfoque podría ser la utilización de la subprocess módulo a la granja fuera de cada iteración a un proceso separado, cada uno con su propio espacio de memoria que se libera tan pronto como el proceso de las salidas. Ver esta respuesta para una explicación: el Trabajo en torno a la lentitud de los tiempos de procesamiento en ArcGIS 9.3 con Spatial Analyst funciones

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X