Python: Error de memoria
Para romper esto, primero debes romper tu algoritmo. No rompamos la palabra todavía.
Limpie su algoritmo para evitar bucles triples y evitar el uso extensivo de múltiples anidamientos de diccionarios.
Evidentemente su volumen de datos es enorme. Sigo utilizando un algoritmo que consume tanta memoria y CPU. Sólo algoritmos mejorados pueden resolver este problema. Incluso si estás programado en lenguaje C, puedes quedarte sin memoria. Si pones la matriz en un diccionario, la memoria definitivamente se verá abrumada. Por cierto, el Python que utilices debe ser de 32 bits. Sería mejor si fuera de 64 bits.
En Python, el procesamiento de big data debe reducir el uso de diccionarios. Si las entradas del diccionario superan un valor determinado de 20.000, tenga cuidado. Los diccionarios se utilizan principalmente para estadísticas, no para cálculos. Se recomienda que considere hacer numpy.array. Si no desea usarlo, use Array. Si aún no desea usarlo, puede usar blist (paquete de terceros) o, en el peor de los casos, usar list. Aunque la búsqueda en el diccionario es más rápida que la lista, consume más memoria.
Para tu pregunta, puedes considerar dos pasos primero. No junte algoritmos. Aunque son eficientes, los costos de mantenimiento posteriores son altos.
El primer paso es calcular el "número de personas que han visto cada elemento". Para ello puedes utilizar un diccionario. Pero como queremos conectar personas y objetos, debe estar mal. Debería ser "contar a alguien que haya visto un artículo".
Aquí el tiempo no tiene nada que ver contigo. El algoritmo no debe calcular la ponderación del "tiempo".
Entiendo que su algoritmo debería ser que cuando un usuario navega por "dos elementos", se acumulará el número de vistas simultáneas de los dos elementos.
Y divide los tiempos por, el usuario busca la raíz cuadrada del producto de i y j veces respectivamente. Este es originalmente un algoritmo muy simple. Lo estás haciendo demasiado complicado.
Te sugiero que hagas esto. Usas dos diccionarios, como este
items_browsed_by_user[userid][product_id]
items_browsed_cross [userid][[product_id_i, product_id_j]]
Recuerda al asignar un valor para items_browsed_cross [id de usuario] [(id_producto_i, id_producto_j)]. Asegúrese de que product_id_i lt; product_id_j
De esta manera solo necesita la mitad de la memoria para almacenar la matriz i*j. Porque al explorar i primero, luego j y primero j, luego i, el resultado es el mismo.
La forma más ideal es escribir un número para el ID de usuario, desde 0 hasta el número de usuarios, para que pueda almacenarse directamente en una matriz. No se requiere diccionario. Luego reemplace el número product_id con un número de secuencia. Esto ocupa menos memoria. Sólo se necesita una matriz bidimensional para almacenar datos.
Si la memoria no es suficiente, se debe introducir una matriz dispersa.
Si eso no es suficiente, está bien. Para cada cálculo, solo se calcula una fila. Luego guárdelo en el disco duro. Calculado por separado por fila y columna. Esto es fácil de hacer en un entorno de big data.