@@ -70,7 +70,7 @@ void MultiShortestPathExecutor::init() {
70
70
for (const auto & leftVid : leftVids) {
71
71
for (const auto & rightVid : rightVids) {
72
72
if (leftVid != rightVid) {
73
- terminationMap_.insert ({ leftVid, { rightVid, true }} );
73
+ terminationMap_.emplace ( std::make_pair ( leftVid, rightVid) , true );
74
74
}
75
75
}
76
76
}
@@ -124,35 +124,48 @@ Status MultiShortestPathExecutor::buildPath(bool reverse) {
124
124
return Status::OK ();
125
125
}
126
126
127
- DataSet MultiShortestPathExecutor::doConjunct (Interims::iterator startIter,
128
- Interims::iterator endIter,
129
- bool oddStep) {
130
- auto & rightPaths = oddStep ? preRightPaths_ : rightPaths_;
127
+ DataSet MultiShortestPathExecutor::doConjunct (
128
+ const std::vector<std::pair<Interims::iterator, Interims::iterator>>& iters) {
131
129
DataSet ds;
132
- for (; startIter != endIter; ++startIter) {
133
- auto found = rightPaths.find (startIter->first );
134
- if (found == rightPaths.end ()) {
135
- continue ;
136
- }
137
- for (const auto & lPath : startIter->second ) {
138
- const auto & srcVid = lPath.src .vid ;
139
- auto range = terminationMap_.equal_range (srcVid);
140
- for (const auto & rPath : found->second ) {
141
- const auto & dstVid = rPath.src .vid ;
142
- for (auto iter = range.first ; iter != range.second ; ++iter) {
143
- if (iter->second .first == dstVid) {
144
- auto forwardPath = lPath;
145
- auto backwardPath = rPath;
146
- backwardPath.reverse ();
147
- forwardPath.append (std::move (backwardPath));
148
- if (forwardPath.hasDuplicateVertices ()) {
149
- continue ;
150
- }
151
- Row row;
152
- row.values .emplace_back (std::move (forwardPath));
153
- ds.rows .emplace_back (std::move (row));
154
- iter->second .second = false ;
130
+ for (const auto & iter : iters) {
131
+ const auto & leftPaths = iter.first ->second ;
132
+ const auto & rightPaths = iter.second ->second ;
133
+ if (leftPaths.size () < rightPaths.size ()) {
134
+ for (const auto & leftPath : leftPaths) {
135
+ const auto & srcVid = leftPath.src .vid ;
136
+ for (const auto & rightPath : rightPaths) {
137
+ const auto & dstVid = rightPath.src .vid ;
138
+ auto found = terminationMap_.find ({srcVid, dstVid});
139
+ if (found == terminationMap_.end ()) {
140
+ continue ;
141
+ }
142
+ auto forwardPath = leftPath;
143
+ auto backwardPath = rightPath;
144
+ backwardPath.reverse ();
145
+ forwardPath.append (std::move (backwardPath));
146
+ Row row;
147
+ row.values .emplace_back (std::move (forwardPath));
148
+ ds.rows .emplace_back (std::move (row));
149
+ found->second = false ;
150
+ }
151
+ }
152
+ } else {
153
+ for (const auto & rightPath : rightPaths) {
154
+ const auto & dstVid = rightPath.src .vid ;
155
+ for (const auto & leftPath : leftPaths) {
156
+ const auto & srcVid = leftPath.src .vid ;
157
+ auto found = terminationMap_.find ({srcVid, dstVid});
158
+ if (found == terminationMap_.end ()) {
159
+ continue ;
155
160
}
161
+ auto forwardPath = leftPath;
162
+ auto backwardPath = rightPath;
163
+ backwardPath.reverse ();
164
+ forwardPath.append (std::move (backwardPath));
165
+ Row row;
166
+ row.values .emplace_back (std::move (forwardPath));
167
+ ds.rows .emplace_back (std::move (row));
168
+ found->second = false ;
156
169
}
157
170
}
158
171
}
@@ -161,28 +174,51 @@ DataSet MultiShortestPathExecutor::doConjunct(Interims::iterator startIter,
161
174
}
162
175
163
176
folly::Future<bool > MultiShortestPathExecutor::conjunctPath (bool oddStep) {
164
- size_t batchSize = leftPaths_.size () / static_cast <size_t >(FLAGS_num_operator_threads);
177
+ auto & rightPaths = oddStep ? preRightPaths_ : rightPaths_;
178
+ size_t leftPathSize = leftPaths_.size ();
179
+ size_t rightPathSize = rightPaths.size ();
165
180
std::vector<folly::Future<DataSet>> futures;
166
- size_t i = 0 ;
181
+ std::vector<std::pair<Interims::iterator, Interims::iterator>> pathIters ;
167
182
168
- auto startIter = leftPaths_.begin ();
169
- for (auto leftIter = leftPaths_.begin (); leftIter != leftPaths_.end (); ++leftIter) {
170
- if (i++ == batchSize) {
171
- auto endIter = leftIter;
172
- endIter++;
173
- auto future = folly::via (runner (), [this , startIter, endIter, oddStep]() {
174
- return doConjunct (startIter, endIter, oddStep);
175
- });
176
- futures.emplace_back (std::move (future));
177
- i = 0 ;
178
- startIter = endIter;
183
+ size_t i = 0 ;
184
+ if (leftPathSize > rightPathSize) {
185
+ size_t batchSize = leftPathSize / static_cast <size_t >(FLAGS_num_operator_threads);
186
+ pathIters.reserve (batchSize);
187
+ for (auto leftIter = leftPaths_.begin (); leftIter != leftPaths_.end (); ++leftIter) {
188
+ auto rightIter = rightPaths.find (leftIter->first );
189
+ if (rightIter == rightPaths.end ()) {
190
+ continue ;
191
+ }
192
+ pathIters.emplace_back (leftIter, rightIter);
193
+ if (++i == batchSize) {
194
+ auto future = folly::via (
195
+ runner (), [this , iters = std::move (pathIters)]() { return doConjunct (iters); });
196
+ futures.emplace_back (std::move (future));
197
+ pathIters.reserve (batchSize);
198
+ i = 0 ;
199
+ }
200
+ }
201
+ } else {
202
+ size_t batchSize = rightPathSize / static_cast <size_t >(FLAGS_num_operator_threads);
203
+ pathIters.reserve (batchSize);
204
+ for (auto rightIter = rightPaths.begin (); rightIter != rightPaths.end (); ++rightIter) {
205
+ auto leftIter = leftPaths_.find (rightIter->first );
206
+ if (leftIter == leftPaths_.end ()) {
207
+ continue ;
208
+ }
209
+ pathIters.emplace_back (leftIter, rightIter);
210
+ if (++i == batchSize) {
211
+ auto future = folly::via (
212
+ runner (), [this , iters = std::move (pathIters)]() { return doConjunct (iters); });
213
+ futures.emplace_back (std::move (future));
214
+ pathIters.reserve (batchSize);
215
+ i = 0 ;
216
+ }
179
217
}
180
218
}
181
219
if (i != 0 ) {
182
- auto endIter = leftPaths_.end ();
183
- auto future = folly::via (runner (), [this , startIter, endIter, oddStep]() {
184
- return doConjunct (startIter, endIter, oddStep);
185
- });
220
+ auto future =
221
+ folly::via (runner (), [this , iters = std::move (pathIters)]() { return doConjunct (iters); });
186
222
futures.emplace_back (std::move (future));
187
223
}
188
224
@@ -192,7 +228,7 @@ folly::Future<bool> MultiShortestPathExecutor::conjunctPath(bool oddStep) {
192
228
}
193
229
194
230
for (auto iter = terminationMap_.begin (); iter != terminationMap_.end ();) {
195
- if (!iter->second . second ) {
231
+ if (!iter->second ) {
196
232
iter = terminationMap_.erase (iter);
197
233
} else {
198
234
++iter;
0 commit comments