Incapaz de liberar la RAM
Publicado por Mikel (1 intervención) el 02/11/2020 17:06:12
Buenas, tengo un programa para leer varias sheets de un excel. Leo los valores, les doy un formato de diccionario para luego usarlo para añadirlos en una base de datos. El problema viene en que no soy capaz de liberar la memoria RAM que se utiliza al leer el excel, y al hacerlo varias veces en un loop se me satura la RAM.
He probado las siguientes cosas:
- Utilizar el garbage collector del modulo gc.
- Obligar a que todas las variables no sean dependientes de ninguna otra (he comprobado que no tengo variables que apuntan a otras, ya que elimino todas menos los input y outputs del script y esta variable no se ve modificada. Los input los copio, no utilizo directamente los input menos variables simples como integers y strings).
- He utilizado las funciones de release_resources() y unload_sheet(theSheetName).
El codigo:
Cualquier ayuda es bienvenida.
He probado las siguientes cosas:
- Utilizar el garbage collector del modulo gc.
- Obligar a que todas las variables no sean dependientes de ninguna otra (he comprobado que no tengo variables que apuntan a otras, ya que elimino todas menos los input y outputs del script y esta variable no se ve modificada. Los input los copio, no utilizo directamente los input menos variables simples como integers y strings).
- He utilizado las funciones de release_resources() y unload_sheet(theSheetName).
El codigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
def get_excel_trazas(book,theSheetName,myKeyConversor):
"""
Open and read the Excel file, trazas sheet"""
# get the defined worksheetdefined_sheet = book.sheet_by_name(theSheetName)
# read a the whole sheet row by rowtheWholeExcell=[]
theModule={}
num_rows = defined_sheet.nrows
for row_idx in range(1,num_rows):
# Raed the data of each module. For that: # 1) Identify if I am on the same moduletheModuleId=defined_sheet.cell(row_idx, 0)
if row_idx==1:
preModule=int(theModuleId.value)
else:if preModule!=int(theModuleId.value):
# save on the list the dictionarytheWholeExcell.append(theModule.copy())
# Erase and declare the theModule dictionarytheModule.clear()
else:pass
# 2) Save the value on the dictionarytheKeyName=defined_sheet.cell(row_idx, 1)
theValue=defined_sheet.cell(row_idx,2)
# Save the value in dicttheModule[theKeyName.value]=theValue.value
preModule=int(theModuleId.value)
del theKeyName, theValue, theModuleId
# Save the last Module (if only one, it saves it)theWholeExcell.append(theModule.copy())
theModule.clear()
Out=tuple(theWholeExcell)
del defined_sheet, num_rows, row_idx, theWholeExcell, theModule, preModule
book.unload_sheet(theSheetName)
book.release_resources()
gc.collect()
# Return the whole excell dictionaryreturn Out
Cualquier ayuda es bienvenida.
Valora esta pregunta


0