Using Groups of Rows in a Parfor Loop

2 views (last 30 days)
Below is my code that is attempting to populate a variable using section of rows. The original ContractFile is hundreds of thousands of rows - the thinking is I can populate the variable on different workers using the parfor loop which will populate sections of 10,000 rows at a time on a different worker. Example: Rows 1:10,000 to one worker, rows 10,001:20,000 to a different worker, etc. This code works as a regular for loop, but breaks as a parfor loop and I can't figure out why. Thanks!
parfor i = 1:Contracts
Rows = (i-1)*10000+(1:10000);
Var1(Rows,:) = ContractFile(Rows,2) .* ContractFile(Rows,8);
end
  1 Comment
Matt J
Matt J on 1 Apr 2020
Why is the loop necessary? Why not simply,
Var1=ContractFile(:,2) .* ContractFile(:,8);

Sign in to comment.

Accepted Answer

Matt J
Matt J on 1 Apr 2020
Edited: Matt J on 1 Apr 2020
As mentioned in my comment, your example does not make it clear why a loop is necessary at all. However, the reason for your difficulty is that your parfor code violates these rules. One way to fix it is as follows:
Var1=nan(10000,Contracts);
A=reshape(ContractFile(1:Contracts*10000,2),10000,[]);
B=reshape(ContractFile(1:Contracts*10000,8),10000,[]);
parfor i = 1:Contracts
Var1(:,i) = A(:,i).*B(:,i);
end
Var1=Var1(:);
  5 Comments
Derek De Vries
Derek De Vries on 2 Apr 2020
Edited: Derek De Vries on 2 Apr 2020
I apologize, I misunderstood how this code was working and it works great - so thank you!
A couple of follow up questions:
  1. How does the final line of code execute? It appears to me that the code is just saying make Var1 equal all rows of the current Var1 variable. So I would think it would remain a 10,000xN matrix. How did it know to bring all of those columns in 2:N to the row 10,001 then 20,001, etc?
  2. If the last "block" of rows isn't the full amount of exactly 10,000 (Example: There are 123,456 total rows in the Contract File) is there a way to code that the final grouping should be 3,456 rows instead of 10,000 inside of the parfor loop or would that piece have to just be performed outside of the loop at the end?
Matt J
Matt J on 2 Apr 2020
Edited: Matt J on 2 Apr 2020
1. Var1=Var1(:) is equivalent to Var1=reshape(Var1,[],1). See also
2. You could pre-pad the array (e.g., with NaNs) to have an even multiple of 10000 elements and then proceed as above. Or, instead of reshaping, you could also partition your input data into cells and use cell array indexing. To do this splitting, I recommend mat2tiles (Download) because it will handle non-even multiples of 10000 rows, as demonstrated in the code below.
CF=mat2tiles(ContractFile,[10000,Inf]);
N=numel(C);
Var1=cell(numel(C),1);
parfor i=1:N
Var1{i}=CF{i}(:,2).*CF{i}(:,8);
end
Var1=cell2mat(Var1);

Sign in to comment.

More Answers (0)

Categories

Find more on Parallel for-Loops (parfor) in Help Center and File Exchange

Tags

Products


Release

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!