私は約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が役に立ちます。