2015-01-11 1 views
4

내가 가져 오기위한 MongoDB에 의해 허용되는 (이 JSON 형식으로 25 개 이상의 milion 행이 15기가바이트 파일을이 매우 느립니다 동안 :mongoimport의 속도는 -jsonArray을 사용하여

[ 
    {"_id": 1, "value": "\u041c\..."} 
    {"_id": 2, "value": "\u041d\..."} 
    ... 
] 

언제 나를 위해 정말 느린 내가 초당 50 행의 속도를 얻을 다음 명령을 사용하여 MongoDB에서 그것을 가져 노력하고있어.

mongoimport --db wordbase --collection sentences --type json --file C:\Users\Aleksandar\PycharmProjects\NLPSeminarska\my_file.json -jsonArray 

내가 pymongo와 파이썬을 사용하여 컬렉션에 데이터를 삽입하려고 할 때 속도가 더 나 빠졌고 프로세스의 우선 순위를 높이려고했지만 d idn't 어떤 차이.

내가 시도한 다음 것은 동일한 일이지만 -jsonArray을 사용하지 않고 큰 속도 증가 (~ 4000/초)가 있지만 제공된 JSON의 BSON 표현이 너무 큼습니다.

또한 파일을 5 개의 개별 파일로 분할하고 별도의 콘솔에서 같은 컬렉션으로 가져 오려고했지만 약 20 개의 문서/초까지 속도가 모두 저하되었습니다.

웹 전체를 검색하는 동안 사람들은 초당 8K 문서 속도를 보았고 무엇이 잘못되었는지를 볼 수 없었습니다.

속도를 높이는 방법이 있습니까? 아니면 bson으로 전체 json 파일을 변환하고 그런 식으로 가져와야합니까? 그렇다면 변환 및 가져 오기를 모두 수행하는 올바른 방법은 무엇입니까?

큰 감사.

+2

'--jsonArray'만으로 유효한 옵션이므로 구문이 잘못되었다는 것을 알고 있습니다. 다음은 BSON Limit가 있기 때문에 이런 방식으로 한 번에 "slurped"될 수있는 데이터에 16MB 제한이 부과된다는 것입니다. 결론은 입력 파일에서'[]'대괄호 문자를 제거한 다음, 줄 바꿈 문서 중괄호'{}'다음에 줄 바꿈'\ n' 문자로 모든 줄을 끝내는 것입니다. 궁극적으로 파일을 한 번 쪼개십시오. 이 방법으로 처리하고 여러 프로세스를 병렬로 실행합니다. 15GB 파일입니다. 너는 무엇을 기대 했는가? 밀리 초 응답? –

+0

또한 주제에서 많이 벗어났습니다. 스택 오버플로는 프로그래밍 항목에만 사용됩니다. 이 방법은 [dba.stackexchange.com] (http://dba.stackexchange.com)과 첫 번째 게시 위치에 더 적합합니다. –

+1

@NeilLunn, [] 대괄호를 제거하고 --jsonArray를 사용하지 말고 응답을 보내 주셔서 대단히 감사합니다. 가져 오기가 초당 약 8500 개의 문서로 이루어졌습니다. 그리고 정확한 사이트에 나를 가리켜 주셔서 감사합니다. 좋은 하루 되세요. – Aleksandar

답변

2

160Gb 덤프 파일과 똑같은 문제가 있습니다. -jsonArray으로 원래 파일의 3 %를로드하는 데 2 ​​일이 걸렸으며 15 분 동안 변경되었습니다.

첫째, 초기 [ 및 후행 ] 문자를 제거 : 파일이 크다

mongoimport --db "dbname" --collection "collectionname" --file filename.json 

경우, sed 정말 시간이 오래 걸릴 것 :

sed 's/^\[//; s/\]$/' -i filename.json 

는 그 다음 -jsonArray 옵션을 사용하지 않고 가져 어쩌면 스토리지 문제가 생길 수도 있습니다. 나는이 질문의 마이그레이션을 제안 할 힘이 없어하지만 난이 도움이 될 수 있다고 생각 :

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; 
}; 

PS를 : 당신은 대신이 C 프로그램을 사용할 수 있습니다 (내게로 기록되지를, 모든 영광은 @guillermobox합니다) .

관련 문제