2017-01-02 14 views
6

Я работаю с программой, которая имеет дело с файлами, я могу сделать несколько вещей, как переименовать их, прочитать содержимое них и т.д.Trading RAM ЦПУ (проблема производительности)

Сегодня я инициализацией следующим образом:

return new Promise((resolve, reject) => { 
    glob("path/for/files/**/*", { 
    nodir: true 
    }, (error, files) => { 
    files = files.map((file) => { 
     // properties like full name, basename, extension, etc. 
    }); 
    resolve(files); 
    }); 
}); 

Итак, я прочитал содержание определенной директории, возвращать все файлы в массиве, а затем использовать Array.map перебрать массив и изменить пути для объекта со свойствами.

Иногда я работаю с 200 000 текстовыми файлами, поэтому это становится проблемой, потому что она потребляет слишком много ОЗУ.

Итак, я хочу заменить конструкцией с ленивой загрузкой .. но я никогда этого не делал раньше ... поэтому я ищу помощь.

Вот мой код:

class File { 
    constructor(path) { 
    this.path = path; 
    } 

    extension() { 
    return path.extname(this.path); 
    } 
    // etc 
} 

Итак, мой главный вопрос: я должен возвращать только оценку имущества, или я должен заменить его? Как это:

extension() { 
    this.extension = path.extname(this.path); 
} 

Я понимаю, что это компромисс .. я буду торговать память по использованию центрального процессора.

спасибо.

+0

Как о * не * с помощью классов? Не можете ли вы сохранить данные файла в простых объектах? – MaxArt

+0

Я храню файл в массиве объектов, а какой - объект. Я хочу изменить классы, чтобы улучшить использование памяти. –

+0

@FXAMN Почему вы считаете, что классы уменьшат использование памяти? – Raito

ответ

0

Если вы хотите, чтобы уменьшить использование оперативной памяти, я предлагаю вам сохранить дополнительный файл мета-данных для каждого пути, следующим образом:

  1. Держите пути в памяти, или некоторые из них, по мере необходимости.

  2. Сохранение файлов свойств на жесткий диск

files.forEach((file) => { 
    // collect the properties you want for the file 
    // ... 
    var json = { path: file, extension: extension, .. } 

    // mark the metadata file so you can access it later, for example: put it in the same path with a suffix 
    var metaFile = path + '_meta.json'; 
    fs.writeFile(metaFile, JSON.stringify(json), (err) => { 
    if (err) throw err; 
    }); 
});

Теперь все мета-данные на жестком диске. Таким образом, я полагаю, вы торгуете память для дискового пространства и вызовов ЦП.

  1. Если вы хотите получить свойства для файла, просто прочитайте и JSON.parse соответствующий ему файл метаданных.
0

Нет причин для торговли ЦП для космоса. Просто ходите по дереву и обрабатывайте файлы по мере их обнаружения. Пространство, необходимое для ходьбы по дереву, пропорционально глубине дерева, если сначала делается глубина. Это почти наверняка имеет такие же накладные расходы, как и просто создание списка путей в вашем существующем коде.

Для справочника ходьба, node.js FAQ рекомендует node-findit. Документация там довольно ясна. Ваш код будет выглядеть примерно так:

var finder = require('findit')(root_directory); 
var path = require('path'); 
var basenames = []; 

finder.on('file', function (file, stat) { 
    basenames.push(path.basename(file)); 
    // etc 
} 

Или вы можете обернуть захваченные значения в объект, если хотите.

0

Если вы сохраняете только свойство пути, то экземпляр класса NodeJS принимает для вашего примера 200k * (path.length * 2 + 6) байт памяти.

Если вы хотите использовать отложенную загрузку для basenames, extenstions и т.д. использовать ленивые добытчик

class File { 
    constructor(path) { 
    this.path = path; 
    this._basename = null; 
    this._extname = null; 
    } 
    get extname() { 
    return this._extname || (this._extname = path.extname(this.path)); 
    } 
    get basename() { 
    return this._basename || (this._basename = path.basename(this.path)); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^