Ligeramente modificado.
Código Python:
Ver originaldef findGoodPages(pathToTable, pages, rows, columns, possibleValues):
with openFile(pathToTable, 'r') as f:
tab = f.getNode("/previous")
#Lo que necesito hacer es recorrer toda la pytable y seleccionar ciertos campos
#pero unicamente de las rows que cumplan ciertas condiciones
#primero convierto las listas a conjuntos, esto aumenta la eficiencia en las busquedas
dpages = set(pages)
drows = set(rows)
dcolumns = set(columns)
dpossibleValues = set(possibleValues)
#aqui guardare lo que necesito
result = []
t1 = time.time()
#dpossibleValues guarda 800 posibles valores de un total de mas de 1000
for i in dpossibleValues:
aux = []
for row in tab.where("(value == i)"):
if (row['page'] in dpages) and (row['page_row'] in drows) and (row['page_col'] in dcolumns):
aux.append(row['is_ok'])
aux = np.array(aux)
mean = aux.mean()
std = aux.std()
del aux
result.append((i, mean, std))
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.