下载大量图像读取 JSON 文件

Download huge number of images reading a JSON file

我的任务是解析大量 json 数据(包含 100 万 URLs)并将图像下载到本地服务器,但在下载时我们丢失了大量数据(大约 50k ) 未在日志文件中捕获

我们正在将大 json 文件拆分成几个小 json 文件。我们在 nodeJS 中编写了一个程序,它从 JSON 读取 URLs(由图像组成)并将该图像下载到本地服务器,但是在这个过程中我们丢失了大量未写入的数据在日志文件中或未下载。

那么这段代码需要做哪些修改呢?

我的JSON

    [{
        "url": "http://example1.com", 
        "id": "jweewewii833388efje.jpg", 
        "class": 2
    }, 
    {
        "url": "http://example2.com", 
        "id": "987c2732561cb6bbc151cb6e184d019b.jpg", 
        "class": 24
    }, 
    {
        "url": "http://example3.com", 
        "id": "141cbe32ed1f0071431677a2c7754a70.jpg", 
        "class": 22
    }, 
    {
        "url": "http://example4.com", 
        "id": "291a09e237b43d9fa1bf64481a679eaf.png", 
        "class": 1
    }]

Node.js 代码

var fs = require('fs'),
JSONStream = require('JSONStream'),
es = require('event-stream');
const download = require('image-downloader')
var util = require('util');
var log_file = fs.createWriteStream('logfiles/log13.log', {flags : 'w'});

var getStream = function () {
    var jsonData = 'train.json',
    stream = fs.createReadStream(jsonData, {encoding: 'utf8'}),
    parser = JSONStream.parse('*');
    return stream.pipe(parser);
};

getStream()
  .pipe(es.mapSync(function (data) {
        //console.log(data.url);
        const options = {
         url: data.url,
         dest: './uploads/'+data.id             // Save to /path/to/dest/image.jpg
        }
        download.image(options)
         .then(({ filename, image }) => {
        console.log('Saved to', filename)  // Saved to /path/to/dest/image.jpg
         })
         .catch((err) => {
            //errorlog.error(`Error Message : $(data.id)${err}`);
            const logdata = function(d) { //
              log_file.write(util.format(d) + '\n');
              //log_stdout.write(util.format(d) + '\n');
            };
            console.error =logdata
             console.error(" Error URL:: "+data.url+" ID::"+data.id+"::"+err)
         })


}));

我想下载全部数据而不丢失任何数据。如果有任何错误 URL 将写入日志文件 例如:如果我正在处理来自 Json 文件的 10k 数据,我希望下载大约 8k 图像,其他 2k 将写入日志文件

我认为您错过了调用负责记录失败操作的函数。我修改了你的代码并添加了 "NOTEs"。希望对你有帮助。

const fs = require('fs');
const JSONStream = require('JSONStream');
const es = require('event-stream');
const download = require('image-downloader')
const util = require('util');
const log_file = fs.createWriteStream('logfiles/log13.log', { flags: 'w' });

const getStream = function () {
    const jsonData = 'train.json',
        stream = fs.createReadStream(jsonData, { encoding: 'utf8' }),
        parser = JSONStream.parse('*');
    return stream.pipe(parser);
};

getStream()
    .pipe(es.mapSync(function (data) {
        //console.log(data.url);
        const options = {
            url: data.url,
            dest: `./uploads/${data.id}`             // Save to /path/to/dest/image.jpg
        }
        download.image(options)
            .then(({ filename, image }) => {
                console.log('Saved to', filename)  // Saved to /path/to/dest/image.jpg
            }).catch((err) => {

                //errorlog.error(`Error Message : $(data.id)${err}`);

                /* 
                     NOTE: I am assuming the function below logs the affected data
                      in some file that you can access at a later time(?)
                 */

                const logdata = function (d) { //
                    log_file.write(util.format(d) + '\n');
                    //log_stdout.write(util.format(d) + '\n');
                };

                // NOTE: Call the function and pass the data to log it for later review
                logdata(data);

                // NOTE: I commented the below line out
                // console.error =logdata

                // Output to console as you have done before
                console.error(" Error URL:: " + data.url + " ID::" + data.id + "::" + err)
            });
    }));