Depende de la escala del spidering que vaya a realizar y del tipo de máquina en la que lo esté haciendo. Supongamos que una URL típica es una cadena de 60 bytes más o menos, un conjunto en memoria tomará un poco más de 100 bytes por URL (los conjuntos y dictados en Python nunca pueden crecer más del 60% de su capacidad, por razones de velocidad). Si tiene un equipo de 64 bits (y una distribución de Python) con aproximadamente 16 GB de RAM disponibles, seguramente podría dedicar más de 10 GB al conjunto crucial en cuestión, lo que le permite arañar fácilmente alrededor de 100 millones de URL más o menos; pero en el otro extremo, si tienes una máquina de 32 bits con 3 GB de RAM, claramente no puedes dedicar mucho más que un GB al conjunto crucial, lo que te limita a aproximadamente 10 millones de URL. Sqlite ayudaría en el mismo rango de tamaño en que una máquina de 32 bits no podría hacerlo, pero una de generosas capacidades de 64 bits podría, digamos, 100 o 200 millones de URL.
Además de eso, recomiendo PostgreSQL, que también tiene la ventaja de poder ejecutarse en una máquina diferente (en una LAN rápida) básicamente sin problemas, lo que le permite dedicar su máquina principal a spidering. Supongo que MySQL & c estaría bien para eso también, pero me encanta el cumplimiento estándar y robustez de PostgreSQL ;-). Esto permitiría, digamos, unos miles de millones de URLs sin problemas (solo un disco rápido, o mejor una disposición de RAID, y tanta RAM como sea posible para acelerar las cosas, por supuesto).
Tratando de ahorrar memoria/almacenamiento mediante el uso de un hash de longitud fija en lugar de URLs que pueden ser bastante largo es bien si estás bien con un falso positivo ocasional que le impedirá arrastrándose lo que en realidad es un nuevo URL. Tales "colisiones" no necesitan ser del todo probables: incluso si solo usas 8 bytes para el hash, solo deberías tener un riesgo sustancial de colisión cuando miras miles de millones de URL (la "heurística de raíz cuadrada" para este problema bien conocido).
Con cadenas de 8 bytes para representar las URL, la arquitectura del conjunto en memoria debería admitir fácilmente mil millones de URL o más en una máquina bien dotada como se describe anteriormente.
Así, más o menos el número de URL quieres araña, y la cantidad de RAM se puede prescindir -?)
Este es un problema bastante pesado, depende de cuán fuerte sea su solución :) El mayor problema con el que se encontrará son sitios que colocan cookies y números aleatorios en sus URL, lo que lleva a un espacio de rastreo infinito para obtener atrapado, en algún momento tendrá que comenzar a eliminar duplicados en función del contenido. – Stephen