我在将大型csv文件上传到Azure的表存储时遇到了一个问题,因为它似乎很快地从中流式传输数据,导致它无法正常上传或引发大量的超时错误。
这是我目前的代码:
var fs = require('fs');
var csv = require('csv');
var azure = require('azure');
var AZURE_STORAGE_ACCOUNT = "my storage account";
var AZURE_STORAGE_ACCESS_KEY = "my access key";
var tableService = azure.createTableService(AZURE_STORAGE_ACCOUNT,AZURE_STORAGE_ACCESS_KEY);
var count = 150000;
var uploadCount =1;
var counterror = 1;
tableService.createTableIfNotExists('newallactorstable', function(error){
if(!error){
console.log("Table created / located");
}
else
{
console.log("error");
}
});
csv()
.from.path(__dirname+'/actorsb-c.csv', {delimiter: '\t'})
.transform( function(row){
row.unshift(row.pop());
return row;
})
.on('record', function(row,index){
//Output plane carrier, arrival delay and departure delay
//console.log('Actor:' + row[0]);
var actorsUpload = {
PartitionKey : 'actors'
, RowKey : count.toString()
, Actors : row[0]
};
tableService.insertEntity('newallactorstable', actorsUpload, function(error){
if(!error){
console.log("Added: " + uploadCount);
}
else
{
console.log(error)
}
});
count++
})
.on('close', function(count){
console.log('Number of lines: '+count);
})
.on('error', function(error){
console.log(error.message);
});
CSV文件大约为800mb。
我知道要修复它,我可能需要批量发送数据,但我完全不知道如何做到这一点。
答案 0 :(得分:1)
我不知道azure包还是CSV包,但我建议你使用流上传文件。如果您已将文件保存到驱动器,则可以从中创建read stream,然后使用该流将createBlockBlobFromStream上传到azure。那个问题会重定向我here。我建议你看看它,因为它处理编码。代码提供了一种将文件转换为base64字符串的方法,但我有一个想法,可以使用节点更有效地完成。我不得不调查一下。
答案 1 :(得分:1)
hmm我建议将文件上传到blob存储,并且可以在表存储中引用blob URI。阻止blob选项为您提供了一种简单的批量上传方式。