gpt4 book ai didi

java - Java中获取多个网页最快的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:12 25 4
gpt4 key购买 nike

我正在尝试编写一个快速的 HTML 抓取工具,此时我只专注于在不进行解析的情况下最大化吞吐量。我已经缓存了 URL 的 IP 地址:

public class Data {
private static final ArrayList<String> sites = new ArrayList<String>();
public static final ArrayList<URL> URL_LIST = new ArrayList<URL>();
public static final ArrayList<InetAddress> ADDRESSES = new ArrayList<InetAddress>();

static{
/*
add all the URLs to the sites array list
*/

// Resolve the DNS prior to testing the throughput
for(int i = 0; i < sites.size(); i++){

try {
URL tmp = new URL(sites.get(i));
InetAddress address = InetAddress.getByName(tmp.getHost());
ADDRESSES.add(address);
URL_LIST.add(new URL("http", address.getHostAddress(), tmp.getPort(), tmp.getFile()));
System.out.println(tmp.getHost() + ": " + address.getHostAddress());
} catch (MalformedURLException e) {
} catch (UnknownHostException e) {
}
}
}
}

我的下一步是测试 100 个 URL 的速度,方法是从互联网上获取它们,读取前 64KB 并继续访问下一个 URL。我创建了一个 FetchTaskConsumer 的线程池,我尝试运行多个线程(在 i7 四核机器上有 16 到 64 个),这是每个消费者的样子:

public class FetchTaskConsumer implements Runnable{
private final CountDownLatch latch;
private final int[] urlIndexes;
public FetchTaskConsumer (int[] urlIndexes, CountDownLatch latch){
this.urlIndexes = urlIndexes;
this.latch = latch;
}

@Override
public void run() {

URLConnection resource;
InputStream is = null;
for(int i = 0; i < urlIndexes.length; i++)
{
int numBytes = 0;
try {
resource = Data.URL_LIST.get(urlIndexes[i]).openConnection();

resource.setRequestProperty("User-Agent", "Mozilla/5.0");

is = resource.getInputStream();

while(is.read()!=-1 && numBytes < 65536 )
{
numBytes++;
}

} catch (IOException e) {
System.out.println("Fetch Exception: " + e.getMessage());
} finally {

System.out.println(numBytes + " bytes for url index " + urlIndexes[i] + "; remaining: " + remaining.decrementAndGet());
if(is!=null){
try {
is.close();
} catch (IOException e1) {/*eat it*/}
}
}
}

latch.countDown();
}
}

充其量我能够在大约 30 秒内浏览 100 个 URL,但文献表明我应该能够每秒浏览 300 150 个 URL。请注意,我可以访问千兆位以太网,尽管我目前正在家中使用 20 Mbit 连接运行测试……在任何一种情况下,连接都从未真正得到充分利用。

我试过直接使用 Socket 连接,但我肯定做错了什么,因为那更慢!关于如何提高吞吐量的任何建议?

附言
我有一个包含大约 100 万个常用 URL 的列表,因此如果 100 个 URL 不足以进行基准测试,我可以添加更多 URL。

更新:
literature I'm referring是与 Najork Web Crawler 相关的论文,Najork 指出:

Processed 891 million URLs in 17 Days
That is ~ 606 downloads per second [on] 4 Compaq DS20E Alpha Servers [with] 4 GB main memory[,] 650 GB disk space [and] 100 MBit/sec.
Ethernet ISP rate-limits bandwidth to 160Mbits/sec

所以它实际上是每秒 150 页,而不是 300 页。我的计算机是 Core i7 和 4 GB 内存,我离这个还差得很远。我没有看到任何说明他们特别使用的内容。

更新:
OK,统计……最终结果出来了!事实证明,100 个 URL 对于基准来说有点太少了。我将它增加到 1024 个 URL,64 个线程,我为每次提取设置了 2 秒的超时,我每秒最多可以获取 21 页(实际上我的连接速度约为 10.5 Mbps,所以每秒 21 页 * 64KB每页约为 10.5 Mbps)。这是 getter 的样子:

public class FetchTask implements Runnable{
private final int timeoutMS = 2000;
private final CountDownLatch latch;
private final int[] urlIndexes;
public FetchTask(int[] urlIndexes, CountDownLatch latch){
this.urlIndexes = urlIndexes;
this.latch = latch;
}

@Override
public void run() {

URLConnection resource;
InputStream is = null;
for(int i = 0; i < urlIndexes.length; i++)
{
int numBytes = 0;
try {
resource = Data.URL_LIST.get(urlIndexes[i]).openConnection();

resource.setConnectTimeout(timeoutMS);

resource.setRequestProperty("User-Agent", "Mozilla/5.0");

is = resource.getInputStream();

while(is.read()!=-1 && numBytes < 65536 )
{
numBytes++;
}

} catch (IOException e) {
System.out.println("Fetch Exception: " + e.getMessage());
} finally {

System.out.println(numBytes + "," + urlIndexes[i] + "," + remaining.decrementAndGet());
if(is!=null){
try {
is.close();
} catch (IOException e1) {/*eat it*/}
}
}
}

latch.countDown();
}
}

最佳答案

你确定你的总和吗?

每秒 300 个 URL,每个 URL 读取 64 千字节

这需要:300 x 64 = 19,200 千字节/秒

转换为比特:19,200 千字节/秒 = ( 8 * 19,200 ) 千比特/秒

所以我们有:8*19,200 = 153,600 千比特/秒

然后到 Mb/s:153,600/1024 = 150 兆位/秒

...然而您只有 20 Mb/s 的 channel 。

但是,我想您正在获取的许多 URL 的大小都在 64Kb 以下,因此吞吐量似乎比您的 channel 快。你不是慢,你是快!

关于java - Java中获取多个网页最快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5688295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com