gpt4 book ai didi

java - 使循环更快的最佳实践 - 多线程是一种选择吗?

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

我用 URL 中的索引调用 Api 服务;例如,最后一个索引是:420.555。我这样做:

for(int i =0; i <= 420555;i++){
url = new URl("https://someURL/"+ i);
read the json with BufferedReader reader = new BufferedReader( new InputStreamReader( url.openStream(), "UTF-8" ) )) {

create object from json
save the result to my DB
}

性能很差。

(当然,有很多条目要保存在我的数据库中,但它需要超过 6 个小时并且因为 JAVA VM 中的内存已满而崩溃)

你有什么想法,我怎样才能更快地做到这一点?

如果你需要完整的代码,我可以贴出来。但我认为 for 循环是问题所在...

我的想法是,使用多线程,但我以前从未工作过,我不确定这是否是这种情况的最佳实践。

当多线程是最佳实践时,你能给我举个例子吗?

最佳答案

您的代码:

  • 从 URL 中获取内容作为 json
  • 做一些事情,然后将结果保存到数据库中

它按顺序执行。

所以,是的,当然,并行执行这些循环体应该会减少整体执行时间。它对内存问题没有帮助。正如评论所指出的那样,该问题更可能是由代码中的错误引起的(例如,未正确关闭资源)。

当然,这会引入新的问题;例如处理数据库访问的连接池。

为了添加“多线程”;直接的方法是将任务提交到 ExecutorService - 请参阅 here例如。

最后:第一个真正的答案是退后一步。手头的任务似乎已经很难让您做好!增加更多的复杂性可能有助于解决某些问题;但是您应该绝对首先确保您的代码完全正确并且在添加多于一个线程的东西之前在“顺序模式”下工作。否则,您将以不太确定但更难调试的方式很快遇到其他问题。

第二个真正的答案是:提出 400K 请求绝不是个好主意。不按顺序,不并列。现实世界的解决方案是退后一步,更改该 API 并允许例如批量 读取。不要在 400K 请求中下载 400K 对象。例如每次发出 100 个请求并下载 4K 对象。

长话短说:您的真正问题是您正在使用的 API 的设计。除非你改变它,否则你不是在解决你的问题,而是在对抗症状。

关于java - 使循环更快的最佳实践 - 多线程是一种选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44457077/

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