Cannot use database cursor object inside a parfor
3 次查看(过去 30 天)
显示 更早的评论
If I retrieve data from an sql query using the database interface of matlab database toolbox inside a parfor like this:
parfor i = 1:n
[...]
cursorObj1 = fetch(exec(targetConn,sqlQueryString));
queryData = cursorObj1.Data{1};
[...]
end
Matlab throws the error:
Cell contents reference from a non-cell array object.
Is there a way to accomplish the aforementioned operation inside a parfor? I know the basic rules of variables and objects use inside a parfor, but I can't find a solution for this specific case.
回答(1 个)
Edric Ellis
2018-4-17
You need to create the database connection targetConn directly on the workers. One way to achieve this is to use a parallel.pool.Constant to hold on to it. Something a bit like this:
connection = parallel.pool.Constant(@() database(...), @close); parfor ... ... cursorObj1 = fetch(exec(connection.Value, ...)); ... end
Note that the second argument to the parallel.pool.Constant constructor is the "cleanup" function - this will close the underlying connection when connection goes out of scope.
3 个评论
AJ Geiger
2018-5-19
Not that I know :/ of if you want to debug a parfor loop I have found the best way to do it is to convert the parfor loop to just a for loop.
TIANTIANBABA
2021-1-17
编辑:TIANTIANBABA
2021-1-17
Hello. Even if I build the connection inside the parfor-loop, it seems that exec and fetch still can not work when inside the parfor-loop.
Here is my needs:
I have many sqlite files, and I need to export data from every sqlite file. I want to use parfor-loop to speed up, and inside the loop, I want each worker to connect to a different file, then do the data export work. But until now I don't succeed.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Parallel for-Loops (parfor) 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!