Skip to content

Submission: JavaScript (Multi-Process) #3

Open
@mykeels

Description

@mykeels
  • 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)
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions