Ver Mensaje Individual
  #13 (permalink)  
Antiguo 07/06/2014, 23:00
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Problema: Memory Error

Ligeramente modificado.
Código Python:
Ver original
  1. def findGoodPages(pathToTable, pages, rows, columns, possibleValues):
  2.  
  3.     with openFile(pathToTable, 'r') as f:
  4.  
  5.         tab = f.getNode("/previous")
  6.  
  7.  
  8.         #Lo que necesito hacer es recorrer toda la pytable y seleccionar ciertos campos
  9.         #pero unicamente de las rows que cumplan ciertas condiciones
  10.  
  11.         #primero convierto las listas a conjuntos, esto aumenta la eficiencia en las busquedas
  12.         dpages = set(pages)
  13.         drows = set(rows)
  14.         dcolumns = set(columns)
  15.         dpossibleValues = set(possibleValues)                  
  16.  
  17.         #aqui guardare lo que necesito
  18.         result = []
  19.  
  20.         t1 = time.time()
  21.         #dpossibleValues guarda 800 posibles valores de un total de mas de 1000
  22.  
  23.         for i in dpossibleValues:
  24.             aux = []
  25.             for row in tab.where("(value == i)"):
  26.                 if (row['page'] in dpages) and (row['page_row'] in drows) and (row['page_col'] in dcolumns):
  27.                     aux.append(row['is_ok'])
  28.             aux = np.array(aux)
  29.             mean = aux.mean()
  30.             std = aux.std()
  31.             del aux
  32.             result.append((i, mean, std))
  33.         return result

Escalabilidad es un tema complejo y cada situación es diferente. En tu caso muchas cosas las haces a mano por falta de experiencia en PyTables.

Ejemplo sencillo en SQL:
Objetivo: Sumar todos los campos de una columna.

Lo que tratas de hacer:
Cargar la tabla en memoria. Poner en un arreglo toda la columna deseada. Sumar el arreglo.

Lo que se deberia de hacer:
Crear un query que te de la suma de la columna.

Y el mismo ejemplo puede ser para ordenar, agrupar, etc...

Ahora no se que tan grande sea tu tabla. 5GB? 50GB? 500GB? 2TB? 500TB? 2PB?
Si, 5GB se te hicieron muchos. Entonces tengo malas noticias.

Para optimizar un programa por lo regular uno hace lo siguiente:
1. Hacer profiling.
2. Encontrar el cuello de botella.
3. Remover cuello de botella.
4. Regresar al paso 1.

Optimizar un programa usualmente se hace por capas. Primero haces mas rapido esto, luego aquello, asi hasta que te das cuenta que tu programa mejoro bastante.