Analizar un conjunto de datos CSV muy grande

Tengo un conjunto de datos CSV muy grande (registros 900M) que consta del siguiente formato:

URL | IP | ActivityId 

Datos de ejemplo:

 http://google.com/ | 127.0.0.1 | 2 http://google.com/ | 12.3.3.1 | 2 

Para este formato, deseo obtener todas las actividades únicas por URL.

Lo que intenté hacer fue crear un diccionario donde la clave es la URL y el valor es un conjunto de actividades únicas. Sin embargo, esto falla de forma miserable en cuanto al rendimiento: consume toda la memoria RAM y es muy lento en el tiempo (operación O (n))

¿Hay algún otro enfoque más rápido?

En mi opinión puedes usar dask .

Entonces hay la misma solución que los pandas:

 df.groupby('URL')['ActivityId'].nunique() 

Supongo que, de hecho, ya ha cargado el conjunto de datos en la memoria (digamos que está almacenado en una variable llamada df ), y tiene problemas cuando intenta “obtener todas las actividades únicas por URL”.

Si solo desea el número de actividades únicas por URL, use el método .groupby() :

 df.groupby('URL').ActivityId.nunique() 

Si también desea todos los ActivityId s, use .drop_duplicates() :

 df[['URL','ActivityId']].drop_duplicates() 

Primero tienes que tener claro tus requerimientos. Si tienes 900 MB de datos; y tiene la intención de incluir todos esos datos en un solo diccionario, entonces no debería sorprenderse al descubrir que necesitará 900 MB de RAM al final.

En otras palabras: si desea procesar todos los datos en la memoria al mismo tiempo, todos los datos deben estar en la memoria.

Para acelerar el procesamiento: primero entraría y clasificaría su entrada de CSV (en la columna de la URL); por ejemplo utilizando awk . Ahora puedes leer ese archivo línea por línea; pero sabes que todas las filas con URL idénticas se mostrarán como “bloques”. Significado: ahora no necesita leer todas las URL en la memoria; Puedes procesarlos uno tras otro en su lugar.