Skip to content

Commit 662943c

Browse files
committed
Improve performance of merching rows into given batch size
1 parent 7fff268 commit 662943c

File tree

2 files changed

+37
-10
lines changed

2 files changed

+37
-10
lines changed

src/core/etl/src/Flow/ETL/Extractor/ChunkExtractor.php

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,34 +19,53 @@ public function __construct(
1919

2020
public function extract(FlowContext $context) : \Generator
2121
{
22-
$chunk = new Rows();
22+
$chunk = [];
23+
$chunkSize = 0;
2324

2425
foreach ($this->extractor->extract($context) as $rows) {
2526
foreach ($rows->chunks($this->chunkSize) as $rowsChunk) {
26-
$chunk = $chunk->merge($rowsChunk);
27+
$chunk[] = $rowsChunk->all();
28+
$chunkSize += $rowsChunk->count();
2729

28-
if ($chunk->count() === $this->chunkSize) {
29-
$signal = yield $chunk;
30+
if ($chunkSize === $this->chunkSize) {
31+
$signal = yield new Rows(
32+
...\array_merge(
33+
...$chunk
34+
)
35+
);
3036

3137
if ($signal === Signal::STOP) {
3238
return;
3339
}
34-
$chunk = new Rows();
40+
$chunkSize = 0;
41+
$chunk = [];
3542
}
3643

37-
if ($chunk->count() > $this->chunkSize) {
38-
$signal = yield $chunk->dropRight($chunk->count() - $this->chunkSize);
44+
if ($chunkSize > $this->chunkSize) {
45+
$allRows = new Rows(
46+
...\array_merge(
47+
...$chunk
48+
)
49+
);
50+
51+
$signal = yield $allRows->dropRight($allRows->count() - $this->chunkSize);
3952

4053
if ($signal === Signal::STOP) {
4154
return;
4255
}
43-
$chunk = $chunk->takeRight($chunk->count() - $this->chunkSize);
56+
$leftover = $allRows->takeRight($allRows->count() - $this->chunkSize);
57+
$chunk = [$leftover->all()];
58+
$chunkSize = $leftover->count();
4459
}
4560
}
4661
}
4762

48-
if ($chunk->count()) {
49-
yield $chunk;
63+
if ($chunkSize) {
64+
yield new Rows(
65+
...\array_merge(
66+
...$chunk
67+
)
68+
);
5069
}
5170
}
5271

src/core/etl/src/Flow/ETL/Rows.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ public function add(Row ...$rows) : self
6161
);
6262
}
6363

64+
/**
65+
* return array<Row>.
66+
*/
67+
public function all() : array
68+
{
69+
return $this->rows;
70+
}
71+
6472
/**
6573
* @param int<1, max> $size
6674
*

0 commit comments

Comments
 (0)