2016-07-25 6 views
0

私は約500MBのJSONファイル(もともとは124MBのCSVファイル)の政治的なキャンペーン貢献のデータセットを扱っています。 FirebaseのWebインターフェイスでインポートするには大きすぎます(Google Chromeのタブをクラッシュさせる前に試してみてください)。 CSVから作成されたオブジェクトを手動でアップロードしようとしました(CSVtoJSONコンバータを使用すると、各行がJSONオブジェクトになり、そのオブジェクトがFirebaseにアップロードされます)。大量のデータをFirebaseデータベースにインポートする適切な方法は何ですか?

ここに私が使用したコードがあります。

var firebase = require('firebase'); 
var Converter = require("csvtojson").Converter; 
firebase.initializeApp({ 
    serviceAccount: "./credentials.json", 
    databaseURL: "url went here" 
}); 
var converter = new Converter({ 
    constructResult:false, 
    workerNum:4 
}); 
var db = firebase.database(); 
var ref = db.ref("/"); 

var lastindex = 0; 
var count = 0; 
var section = 0; 
var sectionRef; 
converter.on("record_parsed",function(resultRow,rawRow,rowIndex){ 
    if (rowIndex >= 0) { 
     sectionRef = ref.child("reports" + section); 
     var reportRef = sectionRef.child(resultRow.Report_ID); 
     reportRef.set(resultRow); 
     console.log("Report uploaded, count at " + count + ", section at " + section); 
     count += 1; 
     lastindex = rowIndex; 
     if (count >= 1000) { 
      count = 0; 
      section += 1; 
     } 
     if (section >= 100) { 
      console.log("last completed index: " + lastindex); 
      process.exit(); 
     } 
    } else { 
     console.log("we out of indices"); 
     process.exit(); 
    } 

}); 
var readStream=require("fs").createReadStream("./vUPLOAD_MASTER.csv"); 
readStream.pipe(converter); 

ただし、メモリに問題が発生し、データセットを完了できませんでした。 Firebaseがアップロードされたすべてのデータを表示していなかったため、チャンクでそれをやろうとしていたのです。 (FirebaseデータベースをChromeに開いたままにすると、データが入ってきますが、最終的にはタブがクラッシュし、読み込み時に多くのデータが失われていました)

私はFirebase Streaming Importを使ってみましたが、このエラー:

started at 1469471482.77 
Traceback (most recent call last): 
    File "import.py", line 90, in <module> 
    main(argParser.parse_args()) 
    File "import.py", line 20, in main 
    for prefix, event, value in parser: 
    File "R:\Python27\lib\site-packages\ijson\common.py", line 65, in parse 
    for event, value in basic_events: 
    File "R:\Python27\lib\site-packages\ijson\backends\python.py", line 185, in basic_parse 
    for value in parse_value(lexer): 
    File "R:\Python27\lib\site-packages\ijson\backends\python.py", line 127, in parse_value 
    raise UnexpectedSymbol(symbol, pos) 
ijson.backends.python.UnexpectedSymbol: Unexpected symbol u'\ufeff' at 0 

はその最後の行(ijsonからのエラー)を見上げて、私はthis SO threadを見つけましたが、私はちょうど私がFirebaseストリーミングインポート作業を取得するためにそれを使用することになってるかどうかはわかりません。

は私がアップロードしようとしていたJSONファイルからVimを使用してバイトオーダーマークを除去し、今私は分後または輸入ランニングのように、このエラーが出る:

Traceback (most recent call last): 
    File "import.py", line 90, in <module> 
    main(argParser.parse_args()) 
    File "import.py", line 20, in main 
    for prefix, event, value in parser: 
    File "R:\Python27\lib\site-packages\ijson\common.py", line 65, in parse 
    for event, value in basic_events: 
    File "R:\Python27\lib\site-packages\ijson\backends\python.py", line 185, in basic_parse 
    for value in parse_value(lexer): 
    File "R:\Python27\lib\site-packages\ijson\backends\python.py", line 116, in parse_value 
    for event in parse_array(lexer): 
    File "R:\Python27\lib\site-packages\ijson\backends\python.py", line 138, in parse_array 
    for event in parse_value(lexer, symbol, pos): 
    File "R:\Python27\lib\site-packages\ijson\backends\python.py", line 119, in parse_value 
    for event in parse_object(lexer): 
    File "R:\Python27\lib\site-packages\ijson\backends\python.py", line 170, in parse_object 
    pos, symbol = next(lexer) 
    File "R:\Python27\lib\site-packages\ijson\backends\python.py", line 51, in Lexer 
    buf += data 
MemoryError 

Firebaseストリーミングインポーター250MB以上のファイルを扱えるようになっています。このファイルを処理するのに十分なRAM以上の容量があることは確かです。なぜこのエラーが現れているのかについてのアイデアはありますか?

Firebase Streaming Importを使用してアップロードしようとしている実際のJSONファイルを参照すると、here it isが役に立ちます。

答えて

0

私は、Firebase Streaming Importをあきらめて、CSVを変換するためにcsvtojsonを使用し、その後Firebase Node APIを使って各オブジェクトを1つずつアップロードする独自のツールを作成しました。ここで

はスクリプトです:

var firebase = require("firebase"); 
firebase.initializeApp({ 
    serviceAccount: "./credentials.json", 
    databaseURL: "https://necir-hackathon.firebaseio.com/" 
}); 

var db = firebase.database(); 
var ref = db.ref("/reports"); 
var fs = require('fs'); 
var Converter = require("csvtojson").Converter; 
var header = "Report_ID,Status,CPF_ID,Filing_ID,Report_Type_ID,Report_Type_Description,Amendment,Amendment_Reason,Amendment_To_Report_ID,Amended_By_Report_ID,Filing_Date,Reporting_Period,Report_Year,Beginning_Date,Ending_Date,Beginning_Balance,Receipts,Subtotal,Expenditures,Ending_Balance,Inkinds,Receipts_Unitemized,Receipts_Itemized,Expenditures_Unitemized,Expenditures_Itemized,Inkinds_Unitemized,Inkinds_Itemized,Liabilities,Savings_Total,Report_Month,UI,Reimbursee,Candidate_First_Name,Candidate_Last_Name,Full_Name,Full_Name_Reverse,Bank_Name,District_Code,Office,District,Comm_Name,Report_Candidate_First_Name,Report_Candidate_Last_Name,Report_Office_District,Report_Comm_Name,Report_Bank_Name,Report_Candidate_Address,Report_Candidate_City,Report_Candidate_State,Report_Candidate_Zip,Report_Treasurer_First_Name,Report_Treasurer_Last_Name,Report_Comm_Address,Report_Comm_City,Report_Comm_State,Report_Comm_Zip,Category,Candidate_Clarification,Rec_Count,Exp_Count,Inkind_Count,Liab_Count,R1_Count,CPF9_Count,SV1_Count,Asset_Count,Savings_Account_Count,R1_Item_Count,CPF9_Item_Count,SV1_Item_Count,Filing_Mechanism,Also_Dissolution,Segregated_Account_Type,Municipality_Code,Current_Report_ID,Location,Individual_Or_Organization,Notable_Contributor,Currently_Accessed" 
var queue = []; 
var count = 0; 
var upload_lock = false; 
var lineReader = require('readline').createInterface({ 
    input: fs.createReadStream('test.csv') 
}); 

lineReader.on('line', function (line) { 
    var line = line.replace(/'/g, "\\'"); 
    var csvString = header + '\n' + line; 
    var converter = new Converter({}); 
    converter.fromString(csvString, function(err,result){ 
     if (err) { 
      var errstring = err + "\n"; 
      fs.appendFile('converter_error_log.txt', errstring, function(err){ 
       if (err) { 
       console.log("Converter: Append Log File Error Below:"); 
       console.error(err); 
       process.exit(1); 
      } else { 
       console.log("Converter Error Saved"); 
      } 
      }); 
     } else { 
      result[0].Location = ""; 
      result[0].Individual_Or_Organization = ""; 
      result[0].Notable_Contributor = ""; 
      result[0].Currently_Accessed = ""; 
      var reportRef = ref.child(result[0].Report_ID); 
      count += 1; 
      reportRef.set(result[0]); 
      console.log("Sent #" + count); 
     } 
    }); 
}); 

唯一の注意点は、スクリプトはすぐにすべてのオブジェクトを送信することができますが、Firebaseは明らかに、それはすべてのオブジェクトの後にスクリプトを閉じたとして、それらを保存している間に維持する接続を必要です多くのオブジェクトがデータベースに表示されませんでした。 (私は確かに20分待ったが、それはもっと短くてもよい)

関連する問題