클라우드 스토리지의 버킷에서 트리거되는이 클라우드 기능이 있습니다. 파일을 읽고 N3을 사용하여 각 줄을 rdf 트리플로 변환 한 다음 결과 트리플을 클라우드 스토리지에 씁니다.
전체 파일을 메모리에 다운로드하기 때문에 대용량 파일에는 적합하지 않습니다. 이 기능을 한 번에 한 줄씩 변경하려면 어떻게해야합니까?
const storage = require('@google-cloud/storage')();
const Datastore = require('@google-cloud/datastore');
const N3 = require('n3');
helloGCS = (event, callback) => {
const file = event.data;
if (file.resourceState === 'not_exists') {
console.log(`File ${file.name} deleted.`);
callback(null, 'ok');
} else if (file.metageneration === '1') {
// metageneration attribute is updated on metadata changes.
// on create value is 1
console.log(`File ${file.name} uploaded.`);
let parser = N3.Parser();
const bucket = storage.bucket('woburn-advisory-ttl');
const remoteFile = bucket.file(file.name);
const datastore = new Datastore({});
let number_of_rows = 0;
remoteFile.download()
.then(data => { // convert buffer to string
if (data) {
lines = data.toString().split('\n')
console.log(lines.length)
entities = lines.map(line=>{
let triple = parser.parse(line)[0];
if (triple) {
// console.log(triple)
const tripleKey = datastore.key('triple');
let entity = {
key: tripleKey,
data: [
{
name: 'subject',
value: triple.subject
},
{
name: 'predicate',
value: triple.predicate
},
{
name: 'object',
value: triple.object
}
]
}
return entity
}
else {
return false
}})
entities = entities.filter((entity)=>{return entity})
console.log(entities.length)
datastore.save(entities)
.then((response)=>{
console.log(`Triples created successfully. but... ${response}`);
res.send(`${entities.length} triples created`)
})
}
callback(null, 'ok');
})
}
else {
console.log(`File ${file.name} metadata updated.`);
callback(null, 'ok');
}
};
download()
use 를 호출 하는 대신 createReadStream()
. 이를 통해 메모리에 저장하지 않고 전체 파일을 반복 할 수 있습니다. byline 또는 readline 과 같은 것을 사용 하여 해당 스트림에서 개별 행을 가져올 수 있습니다 .
전반적으로 이것은 다음과 같이 보일 것입니다.
gcsStream = remoteFile.createReadStream();
lineStream = byline.createStream(gcsStream);
lineStream.on('data', function(line) {
let triple = parser.parse(line)[0];
//...
});
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다