better handling of large arrays

This commit is contained in:
biglyderv 2025-02-06 16:38:50 -05:00
parent 8f29cd70fe
commit 97c440fd8b
2 changed files with 15 additions and 8 deletions

20
rank.js
View file

@ -15,7 +15,7 @@ function multiplyMatrix(a, b, c) {
}
// derived from https://git.dervland.net/biglyderv/new-bigly-chat/src/branch/master/docs/stats.php
function rankCalc(result, iterations = 10, main = [], domainMode = false, isGpu = false, arrayMax = 800) {
function rankCalc(result, iterations = 10, main = [], domainMode = false, isGpu = false, arrayMax = 800, oldVals = false) {
let fng = {};
let fnc = {};
@ -25,22 +25,28 @@ function rankCalc(result, iterations = 10, main = [], domainMode = false, isGpu
let keys = Object.keys(result);
let leftover = [];
keys = keys.sort((a,b) => result[a].followers.length < result[b].followers.length);
if (oldVals) {
keys = keys.sort((a, b) => oldVals[b] - oldVals[a]);
} else {
keys = keys.sort((a, b) => result[b].followers.length - result[a].followers.length);
}
let kl2 = keys.length;
if (kl2 > arrayMax) {
console.warn(`Array too big. Splitting into multiple arrays...`);
let ll = {};
let hh = keys.slice(arrayMax);
for (let g of hh) {
for (let g of hh) {
ll[g] = result[g];
}
leftover = rankCalc(ll,iterations,main,domainMode,isGpu,arrayMax);
leftover = rankCalc(ll, iterations, main, domainMode, isGpu, arrayMax);
for (let i in leftover) {
leftover[i] /= (kl2 / arrayMax) * 3;
leftover[i] /= (kl2 / arrayMax);
}
}
keys.length = Math.min(keys.length,1000);
keys.length = Math.min(keys.length, 1000);
let rl = keys.length;
rls = rl ** 2;
@ -163,7 +169,7 @@ function rankCalc(result, iterations = 10, main = [], domainMode = false, isGpu
}
}
pr = Object.assign(pr,leftover);
pr = Object.assign(pr, leftover);
let ov = Object.keys(pr);
let an = ov.filter(i => !isNaN(pr[i]) && main.indexOf(i) != -1);

View file

@ -249,6 +249,7 @@ async function siteCollector(user, path, site, useLimit, data2, settings) {
}
async function main(settings) {
let calcedRank = {};
let { site, discardThreshold, depth, user, matrixIterations, useArchive, } = settings;
user = user.split(',');
@ -317,7 +318,7 @@ async function main(settings) {
}
}
console.log(`Graph is fully repaired`);
let calcedRank = rankCalc(data, (i == depth - 1) ? matrixIterations : 3, user, site == 'url', settings.isGpu, settings.arrayMax)
calcedRank = rankCalc(data, (i == depth - 1) ? matrixIterations : 3, user, site == 'url', settings.isGpu, settings.arrayMax, calcedRank)
dat = Object.entries(calcedRank);
dat = dat.sort((a, b) => b[1] - a[1]);
console.log(`Graph is calculated with ${dat.length} entries`);