Распараллелить дерево предзаказа - PullRequest
0 голосов
/ 05 февраля 2012

Я хочу изменить или клонировать / преобразовать элементы в предварительно отсортированном списке элементов дерева параллельно. То есть обход списка начинается со случайного элемента в списке и обозначает обход поддерева (глубина, родительский указатель, lowerSize и angleStart / angleEnd доступны для радиального обзора).

Мой код в настоящее время выглядит так:

items = ((AbsModel<SunburstContainer, SunburstItem>)model).listIterator(pHitItemIndex);
items.next();
for (int i = pHitItemIndex + 1; i < endIndex && items.hasNext(); i++) {
  final SunburstItem oldChild = items.next();
  final SunburstItem newChild = new SunburstItem(oldChild);
  final float newStartAngle =
    (oldChild.getAngleStart() - oldRoot.getAngleStart()) * angleFactor;
  LOGWRAPPER.debug("angleStart: " + newStartAngle);
  newChild.setAngleStart(newStartAngle);
  float newEndAngle =
    (oldChild.getAngleEnd() - oldChild.getAngleStart()) * angleFactor
     + newChild.getAngleStart();
  LOGWRAPPER.debug("angleEnd: " + newEndAngle);
  if (newEndAngle > PConstants.TWO_PI) {
    newEndAngle = PConstants.TWO_PI;
  }
  newChild.setAngleEnd(newEndAngle);
  newChild.setAngleCenter(newChild.getAngleStart()
    + ((newChild.getAngleEnd() - newChild.getAngleStart()) / 2f));
  newChild.setIndexToParent(oldChild.getIndexToParent() - pHitItemIndex);
  int newDepth = 0;
  LOGWRAPPER.debug("child depth: " + oldChild.getDepth());
  LOGWRAPPER
    .debug("parent depth: " + model.getItem(oldChild.getIndexToParent()).getDepth());
  final int parentDepth = model.getItem(oldChild.getIndexToParent()).getDepth();
  if ((parentDepth + 1) != oldChild.getDepth()) {
    newDepth = oldDepthMax + 2;
  } else {
    newDepth = newItems.get(newChild.getIndexToParent()).getDepth() + 1;
  }
  if (newDepth > depthMax) {
    depthMax = newDepth;
  }
  LOGWRAPPER.debug("newDepth: " + newDepth);
  newChild.setDepth(newDepth);
  newChild.update(mMappingMode, mBuffer);
  newItems.add(newChild);
}

Я думаю просто разделить список (под), то есть [pHitItemIndex + 1, endIndex], на разные части и передать Callables в ExecutorService. В настоящее время весь алгоритм выполняется в Callable, переданном в ExecutorService, но я предполагаю, что я также могу просто отправить разделы / Callables для того же ExecutorService. Интересно, получу ли я какое-либо преимущество от использования актеров, например, с использованием Akka или платформы ForkJoin.

1 Ответ

0 голосов
/ 05 февраля 2012

Звучит как проблема, когда параллельные коллекции в Scala могут помочь.

...