Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态流处理节点.js_Javascript_Node.js_Csv_Stream - Fatal编程技术网

Javascript 动态流处理节点.js

Javascript 动态流处理节点.js,javascript,node.js,csv,stream,Javascript,Node.js,Csv,Stream,我需要解析文件夹中的一些大型CSV文件,并处理CSV中的每一行。我使用一个像下面这样的读取流来处理目录中的500多个CSV文件。我注意到,在暂停/恢复流之后,一些CSV流没有结束或停止在中间读取数据。p> stream = fs.createReadStream(filePath) 所以我考虑为每个CSV动态创建一个流,如下所示,这里是js“JavaScript堆内存不足”错误。 我不确定这是并行处理多个文件流的方式 你能给我以下建议吗 我可以像现在这样使用单个读取流来处理多个文件吗 在前面的

我需要解析文件夹中的一些大型CSV文件,并处理CSV中的每一行。我使用一个像下面这样的读取流来处理目录中的500多个CSV文件。我注意到,在暂停/恢复流之后,一些CSV流没有结束或停止在中间读取数据。p>
stream = fs.createReadStream(filePath)
所以我考虑为每个CSV动态创建一个流,如下所示,这里是js“JavaScript堆内存不足”错误。 我不确定这是并行处理多个文件流的方式

你能给我以下建议吗

  • 我可以像现在这样使用单个读取流来处理多个文件吗
    在前面的流完成之前调用read stream函数

  • 我需要像下面这样动态处理流吗

  • .//解析csv

    let multipleStream = [];
    async function parseCSV(fileName, name) {
      logger.info(`processCSV ${fileName}`);
      let filePath = config.api.basePath + '/test/' + fileName;
      let numConcurrent = 0;
      let paused = false;
      const maxConcurrent = config.api.maxConcurrentJobProcess;
      name = fs.createReadStream(filePath)
          .on('error', (error) => {
            // handle error
            logger.error(`error processing csv`);
    
            reject(error);
    
          })
          .pipe(csv())
          .on('data', async (row) => {
            function checkResume() {
              --numConcurrent;
              if ((paused && numConcurrent < maxConcurrent)) {
                name.resume();
                paused = false;
              }
            }
    
            ++numConcurrent;
            checkResume()
            if (numConcurrent >= maxConcurrent) {
              // pause the stream because we have max number of operations going
              name.pause();
              paused = true;
            }
          })
          .on('end', () => {
            // handle end of CSV
            logger.info(`stream processCSV end ${fileName}`);
          });
      multipleStream.push(name)
    }
    
    async function readDirectory() {
      try {
        var counter = 0;
        fs.readdir(config.api.basePath + '/test/', (err, files) => {
          if (err) throw err;
          for (const file of files) {
            counter++;
            console.log('file', file);
            let name = 'a' + counter;
            parseCSV(file, name)
          }
        });
      } catch (error) {
    
      }
    }
    readDirectory();
    
    let multipleStream=[];
    异步函数parseCSV(文件名、名称){
    info(`processCSV${fileName}`);
    让filePath=config.api.basePath+'/test/'+fileName;
    设numConcurrent=0;
    让暂停=假;
    const maxConcurrent=config.api.maxConcurrentJobProcess;
    name=fs.createReadStream(文件路径)
    .on('错误',(错误)=>{
    //处理错误
    logger.error(`error processing csv`);
    拒绝(错误);
    })
    .pipe(csv())
    .on('data',异步(行)=>{
    函数checkResume(){
    --numoncurrent;
    if((暂停和&numConcurrent=maxConcurrent){
    //暂停流,因为正在进行的操作数最多
    name.pause();
    暂停=真;
    }
    })
    .on('end',()=>{
    //CSV的句柄结束
    info(`stream processCSV end${fileName}`);
    });
    multipleStream.push(名称)
    }
    异步函数readDirectory(){
    试一试{
    var计数器=0;
    fs.readdir(config.api.basePath+/test/,(err,files)=>{
    如果(错误)抛出错误;
    for(文件的常量文件){
    计数器++;
    log('file',file);
    让name='a'+计数器;
    parseCSV(文件、名称)
    }
    });
    }捕获(错误){
    }
    }
    readDirectory();
    
    同时读取多个文件对您来说是否更快?为什么不一次读一本呢?我试图记住细节,但我认为这个
    pause()。我会一次用管道传输一个文件,在每个文件之后解管道。或者,您可以使用
    readable
    事件,并在代码准备就绪时处理它。同时读取多个文件对您来说是否更快?为什么不一次读一本呢?我试图记住细节,但我认为这个
    pause()。我会一次用管道传输一个文件,在每个文件之后解管道。或者,您可以使用
    readable
    事件,并在代码准备就绪时处理它。