【问题标题】:Parallel array copy in JavaJava中的并行数组复制
【发布时间】:2019-10-23 17:47:14
【问题描述】:

我希望将一个数组并行复制到另一个数组中,例如:

int[] a = {1, 3, 5, 7, 9};
int[] b = new int[a.length];
for(int i = 0; i < a.length; i++) // parallel
{
   b[i] = a[i];
}

在这个例子中,我希望一个线程复制前 3 个索引,另一个复制其他 2 个。当然,它也可以是任何其他变体。


需要考虑的事项:

  1. 我打算在非常大的阵列上运行它,所以开销很小就可以了
  2. 循环体中可能添加了更多代码,例如另一个数组 - c 将获得 a[i]+1

我尝试过的:

  1. IntStream.range:
    IntStream.range(0, a.length).parallel().forEach(i -> {
        b[i] = a[i];
    });

这导致Local variable percentiles defined in an enclosing scope must be final or effectively final 错误,因为b 不是final 并且无法分配。

  1. fork/join:可能是这样,但正在寻找不涉及声明新类或扩展现有类的其他解决方案。

【问题讨论】:

  • 数组有多大?
  • 将数组b[]声明为final,然后将值赋给数组b的相应位置
  • ideone.com/vaP3pU final, YMMV,它也可以工作 - 不过,我在这里没有看到真正的问题;如果您的编译器/运行时对b 不是final 感到不满,那就让它final,实际问题在哪里? Local variable percentiles defined in an enclosing scope 建议您在某处有一个名为 percentiles 的变量,它看起来像是错误的真正来源。
  • @malt 数组有超过 100,000,000 个元素。我知道按顺序执行可能会更快,但想知道是否可以使其并行
  • @Bishal Jaiswal 我确定你做不到!它可能会解决第 1 次尝试...

标签: java arrays multithreading parallel-processing


【解决方案1】:

没有理由并行执行此操作;因为您使用的是int[],所以您可以使用clone() 来复制它:

int[] a = {1, 3, 5, 7, 9};
int[] b = a.clone();

如果由于某种原因,您仍想并行执行此操作,则可以使用Arrays#parallelSetAll

Arrays.parallelSetAll(b, i -> a[i]);

对于每个sn-p,b的元素是等价的:

[1, 3, 5, 7, 9]

【讨论】:

  • 不错的解决方案。我不知道Arrays.parallelSetAll
  • 看来你也忘记了第 2 项可能有更多代码添加到循环体中,例如另一个数组 - c 将得到一个[i]+1 - 你不是吗?
  • @user3666197 这种情况,OP可以加Arrays.parallelSetAll(c, i -&gt; a[i] + 1);
  • 在这种情况下,OP 将支付 .parallelSetAll() 的附加开销成本 + 所有内存 I/O 传输成本的两倍 - 再读一遍所有的 a[i]-s,不是吗?
猜你喜欢
  • 2015-12-17
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
相关资源
最近更新 更多