当前位置: 首页 > 面试题库 >

使用Java处理HTTP呼叫的大文件

叶元凯
2023-03-14
问题内容

我有一个包含数百万行的文件,需要处理。文件的每一行都将导致HTTP调用。我正在尝试找出解决问题的最佳方法。

我显然可以读取文件并按顺序进行调用,但是速度会非常慢。我想并行化这些调用,但是不确定是否应该将整个文件读入内存(不是我的忠实拥护者)还是尝试并行化文件的读取(我想我不确定是否有道理)。

只是在这里寻找一些解决问题的最佳方法的想法。如果有一个类似的现有框架或库,我也很乐意使用它。

谢谢。


问题答案:

我想并行化调用,但是不确定是否应该将整个文件读入内存

您应该使用ExecutorService与bounded的BlockingQueue。在读入百万行时,您将作业提交到线程池,直到作业BlockingQueue满为止。这样,您将能够同时运行100个(或最佳数量)的HTTP请求,而无需事先读取文件的所有行。

RejectedExecutionHandler如果队列已满,您将需要设置一个阻止的对象。这比调用方运行处理程序更好。

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(100);
// NOTE: you want the min and max thread numbers here to be the same value
ThreadPoolExecutor threadPool =
    new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, queue);
// we need our RejectedExecutionHandler to block if the queue is full
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
       @Override
       public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
           try {
                // this will block the producer until there's room in the queue
                executor.getQueue().put(r);
           } catch (InterruptedException e) {
                throw new RejectedExecutionException(
                   "Unexpected InterruptedException", e);
           }
    }
});

// now read in the urls
while ((String url = urlReader.readLine()) != null) {
    // submit them to the thread-pool.  this may block.
    threadPool.submit(new DownloadUrlRunnable(url));
}
// after we submit we have to shutdown the pool
threadPool.shutdown();
// wait for them to complete
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);

...
private class DownloadUrlRunnable implements Runnable {
    private final String url;
    public DownloadUrlRunnable(String url) {
       this.url = url;
    }
    public void run() {
       // download the URL
    }
}


 类似资料:
  • 我举了以下例子: 我为Profile类创建了复杂的模型管理器,并且我构建了一个视图来列出大量的人。我试图计算数据库中的所有内容,所以我想从PersonQuerySet调用配置文件管理器。 为此,我需要做如下工作: 然后我应该能够从SQL检索person.profile.computed_revenue,函数“with_computed_revenue”是注释computed_revenue的Pro

  • 问题内容: 如果用户查看我的JavaScript文件,复制函数的内容并使用AJAX向我的服务器发送请求,会发生什么情况?有没有办法适当地防止这种情况的发生? 问题答案: 防止这种情况发生的方法与针对 任何 Web请求采取的保护方法没有什么不同。您这样做是为了使您的站点需要某种形式的身份验证(即用户必须登录),并且如果请求未正确身份验证,则不要执行任何操作。 通常,当您发出AJAX请求时,cooki

  • 使用AudioSource VOICE_UPLINK和Voice_Downlink成功录制的任何一个呼叫。 还有一个问题:-当音频源VOICE_CALL不工作时,它有什么用? 谢谢你。

  • 我在调用我的onLeScan时遇到问题。我在开始扫描中放置了一个标签,每次都会被调用。出于某种原因,我的onLeScan永远不会被调用。有人看到我所做的有问题吗?onLeScan应该在开始扫描后立即调用,对吗? 编辑更改了我的onLeScan函数。仍然不起作用,但我认为我正在走向正确的道路。DeviceBeacon是一个只包含方法的类:getName()、getSignal()和getAddres

  • 1、接口声明 如果您希望在自己的CRM系统嵌入呼叫中心能力,需要对接智齿呼叫中心能力,在对接前请您阅读如下对接流程,以便您更好的完成对接。如果只对接基本呼叫能力,预计对接及调试过程1周左右即可完成。 第一步:获取第三方用户接口调用唯一凭证 请联系您的售后经理,获取您企业的如下信息: 1、companyid(企业id) 2、appid(第三方用户接口调用唯一凭证id) 3、app_key(第三方用户