Оптимизация считывания матрицы на node.js
Доброе время суток, дорогие джава-стриптизёры. Сразу перехожу к сути - требуется считать данные из файла. Файл представляет собой матрицу Nx на Ny (в коде считывание начинается с Ny-1, а не с 0 - особенности задачи), где каждый элемент - число float32. Нижеприведённый код с этим справляется, но есть проблема - матрицы могут быть большими (1000 на 1000), и производительность, соответственно, стремится к уровню Марианской впадины. Опытным путём (ctrl+x на каждой строке в цикле :-) ) было установлено, что больше всего времени занимает именно считывание, остальные вычисления такой нагрузки не дают.
Вопрос - можно ли как-то оптимизировать считывание массива? Мб, считывать сразу всё в один буфер, а потом его как-то раскладывать на флоуты, я не знаю. Писать отдельный плагин на C++ для этой задачи не очень хочется. Заранее благодарю.
P.S. Асинхронное считывание работает медленней, так как приходится под каждое число отдельно создавать буфер в цикле.
for(let y = Ny-1; y > -1; y--) {
for(let x = 0; x < Nx; x++) {
// floatBuffer - буфер на 4 байта
fs.readSync(f, floatBuffer, 0, 4, 56 + (count * 4));
}
}
Ответы (1 шт):
Проблему решил таким способом. Читаем сразу весь файлик в буфер, а потом уже по нему проходимся и типизируем. Разница в производительности более 15 раз
let arrayBuffer = Buffer.alloc(4*Ny*Nx);
fs.readSync(f, arrayBuffer, 0, 4*Ny*Nx, 56);
for(let y = Ny-1; y > -1; y--) {
for(let x = 0; x < Nx; x++) {
z = arrayBuffer.readFloatLE(0+4*count);
count++;
}
}