java - 在 Java 中处理 HTTP 调用的大文件

标签 java multithreading file http

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

我显然可以读取文件并按顺序进行调用,但这会非常慢。我想并行化调用,但我不确定是否应该将整个文件读入内存(我不是很喜欢)或者尝试并行化文件的读取(我'我不确定是否有意义)。

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

谢谢。

最佳答案

I'd like to parallelize the calls, but I'm not sure if I should read the entire file into memory

您应该使用带有有界BlockingQueueExecutorService。当您读入百万行时,您将作业提交到线程池,直到 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
    }
}

关于java - 在 Java 中处理 HTTP 调用的大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13184005/

相关文章:

Java3D 形状只能从一个角度看到

java - 泛型函数的问题

java - Socket编程将android与笔记本电脑连接

java - 使用线程上下文ClassLoader从类路径读取WSDL

java - 如何让 main 方法等待 GUI 上的输入而不使用 Listener 作为直接触发器?

c - 使用 C 中的字符数组中的字符进行多线程读取/处理

java - 有没有一种通用的文件访问方式,既适用于 Android 也适用于 PC?

c++ - 我不明白为什么这段代码无法打开文件

java - 删除字符串中的最后一次出现

swift - 如何在 OSX 上使用 Swift "touch"文件