json - que - mongodb español
La velocidad de mongoimport durante el uso de-jsonArray es muy lenta (1)
Tengo exactamente el mismo problema con un archivo de volcado de 160 Gb. Me tomó dos días cargar el 3% del archivo original con -jsonArray
y 15 minutos con estos cambios.
Primero, elimine los caracteres iniciales [
y finales ]
:
sed ''s/^/[//; s//]$/'' -i filename.json
A continuación, importe sin la opción -jsonArray
:
mongoimport --db "dbname" --collection "collectionname" --file filename.json
Si el archivo es enorme, sed
llevará mucho tiempo y tal vez se encuentre con problemas de almacenamiento. Puede usar este programa C en su lugar (no escrito por mí, todo es gloria para @guillermobox):
int main(int argc, char *argv[])
{
FILE * f;
const size_t buffersize = 2048;
size_t length, filesize, position;
char buffer[buffersize + 1];
if (argc < 2) {
fprintf(stderr, "Please provide file to mongofix!/n");
exit(EXIT_FAILURE);
};
f = fopen(argv[1], "r+");
/* get the full filesize */
fseek(f, 0, SEEK_END);
filesize = ftell(f);
/* Ignore the first character */
fseek(f, 1, SEEK_SET);
while (1) {
/* read chunks of buffersize size */
length = fread(buffer, 1, buffersize, f);
position = ftell(f);
/* write the same chunk, one character before */
fseek(f, position - length - 1, SEEK_SET);
fwrite(buffer, 1, length, f);
/* return to the reading position */
fseek(f, position, SEEK_SET);
/* we have finished when not all the buffer is read */
if (length != buffersize)
break;
}
/* truncate the file, with two less characters */
ftruncate(fileno(f), filesize - 2);
fclose(f);
return 0;
};
PD: No tengo el poder de sugerir una migración de esta pregunta, pero creo que esto podría ser útil.
Tengo un archivo de 15GB con más de 25 millones de filas, que está en este formato json (que es aceptado por mongodb para la importación:
[
{"_id": 1, "value": "/u041c/..."}
{"_id": 2, "value": "/u041d/..."}
...
]
Cuando trato de importarlo en mongodb con el siguiente comando obtengo una velocidad de solo 50 filas por segundo, lo cual es realmente lento para mí.
mongoimport --db wordbase --collection sentences --type json --file C:/Users/Aleksandar/PycharmProjects/NLPSeminarska/my_file.json -jsonArray
Cuando intenté insertar los datos en la colección usando python con pymongo, la velocidad fue aún peor. También traté de aumentar la prioridad del proceso, pero no hizo ninguna diferencia.
Lo siguiente que probé es lo mismo, pero sin usar -jsonArray
y aunque obtuve un gran aumento de velocidad (~ 4000 / seg), dijo que la representación de BSON del JSON suministrado es demasiado grande.
También traté de dividir el archivo en 5 archivos separados e importarlos de consolas separadas en la misma colección, pero obtengo una disminución de la velocidad de todos ellos en aproximadamente 20 documentos / seg.
Mientras buscaba por toda la web, vi que la gente tenía velocidades de más de 8.000 documentos / seg. Y no puedo ver qué hago mal.
¿Hay alguna manera de acelerar esto, o debería convertir todo el archivo json a bson e importarlo de esa manera, y si es así, cuál es la forma correcta de hacer tanto la conversión como la importación?
Muchas gracias.