2013-12-01 3 views
0

Следующая функция предназначена для добавления параллелизма путем обновления элементов списка в кусках в попытке загрузить баланс. Однако его предоставление: свойство «item» не может быть установлено в xs. [X1] во внутреннем цикле. Я должен использовать список, так как список прошлых функций является частью более крупного алгоритма. Какие-либо предложения?Проблемы с обновлением элементов списка

let pmap_tpl_parforlb f (xs:list<_>) = 
    let chunkLength = xs.Length/numProc 
    Parallel.For(0,numProc, fun c ->  
     let x = c * chunkLength 
     let y = (c * chunkLength) + chunkLength 
     let x1 = x+1 
     for x1 in 0..y-1 do 
      xs.[x1] <- f (xs.[x1]) 
    ) |> ignore 
    xs 

ответ

0
  1. xs.length/NUMPROC округляет вниз (вы теряете элементы таким образом, например, 1/8 = 0).
  2. последний кусок не может быть длиной chunkLength, но короче. Вы должны примирить этот факт.
  3. Не должно x1 начинаться с 0, а не в 1?

В любом случае, используйте отладчик для проверки значений времени выполнения переменных, и вы найдете все ошибки.

+2

Он не сможет использовать отладчик, если код не компилируется. Он получает сообщение об ошибке от компилятора, а не исключение во время выполнения. –

2

Встроенный тип списка F # является неизменным, поэтому вы получаете эту ошибку. Вы можете использовать индексную нотацию (blah.[idx]) для доступа к значению списка, но это очень редко, а также медленное, потому что это операция O (n).

Из фрагмента кода, который вы опубликовали, кажется, что вы должны сделать xs массив вместо списка. Или используйте List.toArray или Array.ofList, чтобы преобразовать список в массив до его изменения в Parallel.For.

+0

Собственно, весь пример выглядит как подходящая задача для PLINQ ... :) –

Смежные вопросы