2011-01-05 14 views
5

Tengo una lista de 120 millones de registros de alrededor de 40/50 bytes cada uno, que es aproximadamente 5.5/6 gigabytes de espacio de memoria sin procesar, sin incluir el almacenamiento adicional requerido para mantener un matriz en memoria.Crear una lista única del conjunto de datos demasiado grande para caber en la memoria

Me gustaría asegurarme de que esta lista sea única. La forma en que he intentado hacerlo es crear una cadena Hashset < > y agregar todas las entradas una por una.

Cuando llego a unos 33 millones de registros, me quedo sin memoria y la creación de listas se ralentiza.

¿Existe una mejor manera de ordenar esta enorme lista de entradas de manera oportuna? La única solución en la que puedo pensar es usar una instancia extra grande cuádruple de memoria alta Amazon EC2 durante una hora.

Gracias

+0

¿Dónde se almacena este conjunto de datos? –

Respuesta

6

Si usted está tratando de comprobar la singularidad, simplemente tendrían dividir la secuencia de entrada en cubos, y después comprobar cada segmento por separado.

Por ejemplo, suponiendo que está cargando los datos de un archivo, puede transmitir la entrada y escribirla en 26 archivos diferentes, uno para cada letra con la que comienza el registro (estoy asumiendo ingenuamente cada registro comienza con AZ - por favor, ajuste para su situación real). Luego, puede verificar la singularidad de cada uno de esos archivos más pequeños usando algo como su código existente, ya que ninguno de ellos será demasiado grande para caber en la memoria a la vez. El ciclo inicial garantiza que no habrá entradas duplicadas que estén en diferentes segmentos.

Por supuesto, hay varias maneras diferentes en que puede realizar el agrupamiento, y diferentes enfoques serán efectivos para diferentes conjuntos de datos. Puede dividirlo por código hash, por ejemplo, tome los 5 bits inferiores del código hash para crear 32 cubos diferentes. Es probable que obtenga razonablemente una distribución igual de de registros entre lotes, y no hace suposiciones sobre los datos de entrada. Solo mencioné el "enfoque de tomar la primera letra" más arriba, ya que es una forma más simple de captar el concepto :)

+0

Pensamos igual. ;) – Amber

+0

Gracias Jon y Amber esta es una gran solución que no se me ocurrió. – gary

4

Utilice para ordenar la lista, vaciando regularmente algunos de los contenidos de los depósitos para evitar que se agoten de la memoria Luego cargue cada cubo enjuagado en secuencia y use su enfoque HashSet o clasifíquelo y revíselo de esa manera.

-1

Siempre se puede trabajar en una base de datos sqlite con un índice único, ya que puede ayudar a un procesamiento posterior en el conjunto de datos.

Cuestiones relacionadas