Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何有效地获取巨大的数据量?_Javascript_Database_Algorithm_Sorting_Fetch - Fatal编程技术网

Javascript 如何有效地获取巨大的数据量?

Javascript 如何有效地获取巨大的数据量?,javascript,database,algorithm,sorting,fetch,Javascript,Database,Algorithm,Sorting,Fetch,我有一个反向工程的API端点。我使用它来搜索一个名称,一次请求返回的实体不超过100个。但我想获取的实体大约有130多万个 以下是响应中的一个实体示例: { "name":"COMPANY NAME", "regNo":"100-H", "newRegNo":"191101000018", "type":"Company" } 我可以通过name或regNo进行搜索。搜索没有最小字符限制。我曾想过按字母顺序搜索,但由于它一次返回的实体不超过100个,所以我无法获取其余的实体。因此,我试

我有一个反向工程的API端点。我使用它来搜索一个名称,一次请求返回的实体不超过100个。但我想获取的实体大约有130多万个

以下是响应中的一个实体示例:

{
 "name":"COMPANY NAME",
 "regNo":"100-H",
 "newRegNo":"191101000018",
 "type":"Company"
}
我可以通过
name
regNo
进行搜索。搜索没有最小字符限制。我曾想过按字母顺序搜索,但由于它一次返回的实体不超过100个,所以我无法获取其余的实体。因此,我试图通过
regNo
获取它<代码>注册号可以是1到1000000

下面是我编写的脚本,它通过它们的
regNo
获取所有实体:

const test=async()=>{
常量数据={};
试一试{
常量请求=[];
//因为它一次返回的实体不超过100个,所以它添加了100个
//到每个循环上的搜索查询
对于(设i=100;i<10000;i+=100){
push(fetchData(i));
}
const result=等待承诺。全部(请求);
result.forEach(res=>{
res.entityList.forEach(实体=>{
数据[entity.regNo]=实体;
});
});
//你可以忽略这部分
writeFile(“data.json”,json.stringify(data),err=>{
控制台日志(err);
});
console.log(Object.key(data.length));
}捕捉(错误){
控制台日志(err);
}
};
获取9100个实体(生成100个循环)大约需要15秒 每个
regNo
都有一个这样的字母后缀
11000-H

如果我取100,它将返回如下内容:

entityList: [
    {
      name: "COMPANY NAME",
      regNo: '100-H',
      newRegNo: '191101000018',
      type: 'Company'
    },
    {
      name: "COMPANY NAME",
      regNo: '1000-V',
      newRegNo: '193901000021',
      type: 'Company'
    },
    {
      name: "COMPANY NAME",
      regNo: '10000-T',
      newRegNo: '197001000604',
      type: 'Company'
    },
    {
      name: "COMPANY NAME",
      regNo: '100000-D',
      newRegNo: '198301004377',
      type: 'Company'
    },
    {
      name: "COMPANY NAME",
      regNo: '1000001-W',
      newRegNo: '201001012078',
      type: 'Company'
    },
    {
      name: "COMPANY NAME",
      regNo: '1000002-K',
      newRegNo: null,
      type: 'Company'
    },
    {
      name: "COMPANY NAME",
      regNo: '1000003-U',
      newRegNo: '201001012079',
      type: 'Company'
    },
    {
      name: "COMPANY NAME",
      regNo: '1000004-V',
      newRegNo: '201001012080',
      type: 'Company'
    },
    {
      name: "COMPANY NAME",
      regNo: '1000005-D',
      newRegNo: '201001012081',
      type: 'Company'
    },
    {
      name: "COMPANY NAME",
      regNo: '1000006-A',
      newRegNo: '201001012082',
      type: 'Company'
    },
 .......
如您所见,它不会返回0到99之间的实体。我假设最高的
regNo
1000000个后缀setter
,如果我能在一个循环中获取100到1000000个,我将获取大约100万个实体。但是这里有一个技巧
regNo
有一个后缀字母。让我们假设如果我取100,它将从
100-A
返回到
199-A
。但还有其他实体,如
100-B
100-C
,等等


如何在不丢失数据的情况下高效地获取130多万个实体?好的,看起来您正在查看大约250 MB的数据,请求往返大约需要15毫秒。假设您有100 Mbps的下载速度,理论上最大下载速度为20秒

由于这里涉及的大部分时间似乎都在等待网络往返,您可以尝试大规模并行化。您可以循环并创建多个线程,而不是一个线程循环。在某种程度上,我希望您可以通过这样做获得几乎成比例的加速,因为您几乎没有计算时间,几乎完全没有I/O。超过这一点,您可能会开始耗尽可用的网络资源,并再次陷入瓶颈。但是,您的系统应该能够同时处理许多独立的请求

考虑到您的单线程程序每个请求需要约15毫秒,并且可能有约130万个请求,这样运行大约需要195000秒。使用一个单独的线程,如果你在100000秒左右没有看到一些东西,我会感到惊讶。使用四个线程,您可能会得到大约50000秒。您可能需要尝试较小的范围,并切换线程数,直到看到最佳吞吐量


注意:您正在访问的站点可能已经有(或者如果您开始执行上述操作,可能会快速安装)速率限制器来限制来自单一来源的高容量流量。在你开始使用它之前,先考虑一下你调用的API是否能处理这么多的流量。

JavaScript将在单个线程上进行评估,但是我们可以期望线程池会调用不同的调用调用。运行时内部的幕后活动?同样相关:@Ben Ah您的观点是,默认情况下,节点将发送多个重叠请求,您可以按照答案中的说明配置并行度。但真的会吗?执行
fetchData
的部分位于普通的
for
循环中;代码肯定会在这一点上阻塞,因为您可以在进入下一个迭代之前使用响应来打破循环?OP在这里不这么做,但可以。node.js是否做了足够多的静态分析来做出有根据的猜测,或者只是假设它应该是同步的?node.js API将被同步调用,网络调用将被划分到引擎盖下的线程池中,回调将被异步触发。脚本的执行进度将被诸如
Promise之类的事情延迟。所有的
,但执行的主运行时线程不会因为fetch API的异步性质而被阻止。@Ben我想我明白了,
fetchData
实际上并没有发送请求,只是创建了发送请求的任务。。。这是
承诺。所有的
实际上开始发送如果这是一次性操作,那么您使用的方法有什么问题吗?效率是否与推测可能不探测任何条目的查询有关(因此是毫无价值但不可避免的工作),或者正如Patrick87所述,运行的探测数的性能?是否
fetchData(100)
返回所有实体,其中
regNo
从0到99?感谢您的回复。我更新了问题,使之更清楚。请看一看)您需要列举所有可能的
regNo
s组。对于它们中的每一个,您都需要进行API调用,并将结果附加到数据结构(或文件或数据库)中。您需要考虑避免在服务器上触发拒绝服务保护,因此速率限制在任何时候都有呼叫(例如)十个请求在飞行中。这是我能为您提供的最新信息。