把 4W 条数据放在内存中执行

昨天晚上,朋友问我,怎么把四万条数据放到内存中处理?

作为Nodejser,我是不喜欢一次处理这么多数据的,或者说不希望四万条数据都放在内存中。进一步询问,我才知道问题是这样的。

现在有三类数据,都是数组保存,对这三类数据按顺序排列组合,会得到4W种可能,需要把这4W种结果发送网络请求。

那么问题就从怎么把4W条数据保存在内存简化为排列组合问题了。

简化问题

假设现在有三类数据分别为A,B,C,组合形式为AiBjCk。这个问题就能简化为类似进制问题。

我们把C的数据看为个位,B的数据看为十位,A为百位。当C遍历一次,B下标进一位,当B遍历一次A下标进一位,当A遍历一次,就是全部的排列组合。

Show Time

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function getList(A, B, C) {
let Ai = 0;
let Bi = 0;
let Ci = 0;
let Al = A.length - 1;
let Bl = B.length - 1;
let Cl = C.length - 1;
return (length = 10) => {
let list = [];
let list_i = 0;
while (list_i < length) {
if (A[Ai] === undefined) {
return list;
}
list[list_i] = [A[Ai], B[Bi], C[Ci]];
Ci++; // C位自增
list_i++;
if (Ci > Cl) {
// Ci自增超出Cl,B进位,Ci归零
Bi++;
Ci = 0;
}
if (Bi > Bl) {
// Bi自增超出Bl,Ai进位,Bi归零
Ai++;
Bi = 0;
}
if (Ai > Al) {
// Ai 自增超过Al,返回之前的数据
break;
}
}
return list;
}
}

let A = [1, 2, 0, 23];
let B = [3, 4, 10, 77];
let C = [5, 6, 20, 4];
List = getList(A,B,C);

console.log(List(15));

这里就用到闭包来解决这个问题。为什么用闭包?因为不想内部变量被修改。这个代码没有对传入参数进行检验和拦截,大家凑活看吧。


把 4W 条数据放在内存中执行
https://bubao.github.io/posts/ad5468c0.html
作者
一念
发布于
2021年8月2日
许可协议