sum-files-challenge icon indicating copy to clipboard operation
sum-files-challenge copied to clipboard

Submission: JavaScript (Multi-Process)

Open mykeels opened this issue 5 years ago • 0 comments

  • Time ~2991.455ms
  • Hardware:
      Processor Name: Intel Core i5
      Processor Speed: 2.3 GHz
      Number of Processors: 1
      Total Number of Cores: 2
      L2 Cache (per Core): 256 KB
      L3 Cache: 4 MB
      Memory: 16 GB
const fs = require('fs')
const path = require('path')
const readline = require('readline')
const basePath = '<path-to-files-directory>'
const workerFarm = require('worker-farm')
let worker = workerFarm(require.resolve('./worker.js'))

const getFiles = function* () {
    for (let dir of fs.readdirSync(basePath)) {
        const dirPath = path.join(basePath, dir)
        yield (() => new Promise((resolve, reject) => {
            fs.readdir(dirPath, function (err, files) {
                if (err) {
                    reject (err)
                }
                else {
                    resolve (files.map(file => path.join(dirPath, file)))
                }
            })
        }))()
    }
}

let total = 0
let count = 0

console.time('total')
for (let promise of getFiles()) {
    promise
        .then(files => {
            files.map(filename => {
                worker(filename, (err, sum) => {
                    if (err) {
                        throw err
                    }
                    else {
                        total += sum
                        count++;
                        if (count === 1000) {
                            console.log(total)
                            console.timeEnd('total')
                            process.exit(0)
                        }
                    }
                })
            })
        })
        .catch(err => console.error(err))
}
  • Worker Script
const fs = require('fs')
const readline = require('readline')

module.exports = function (filename, cb) {
    try {
        const lineReader = readline.createInterface({
            input: fs.createReadStream(filename)
        })
        
        let fileSum = 0

        lineReader.on('line', line => {
            let lineSum = 0
            let current = 0
            for(let i = 0; i < line.length; i++) {
                let char = line[i]
                if (char != ',' ) {
                    if (current === 0) {
                        current = +char
                    }
                    else {
                        current = (current * 10) + (+char)
                    }
                }
                if ((char === ',') || (i === (line.length - 1))) {
                    lineSum += current
                    current = 0
                }
            }
            fileSum += lineSum
        })

        lineReader.on('close', () => {
            cb(null, fileSum)
        })
    }
    catch (err) {
        cb(err)
    }
}

mykeels avatar Sep 12 '18 11:09 mykeels