Skip to content

Commit c1cafc5

Browse files
committed
Add ut about empty memtable with 1000 columns
Signed-off-by: JaySon-Huang <[email protected]>
1 parent a26c2df commit c1cafc5

File tree

5 files changed

+76
-20
lines changed

5 files changed

+76
-20
lines changed

dbms/src/Columns/ColumnString.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,10 @@ void ColumnString::reserveWithStrategy(size_t n, IColumn::ReserveStrategy strate
302302
chars.reserve(n * APPROX_STRING_SIZE);
303303
break;
304304
case IColumn::ReserveStrategy::ScaleFactor1_5:
305-
offsets.reserve_exact(n / 2 * 3);
306-
chars.reserve_exact(n * APPROX_STRING_SIZE / 2 * 3);
305+
// offsets.reserve_exact(n / 2 * 3);
306+
// chars.reserve_exact(n * APPROX_STRING_SIZE / 2 * 3);
307+
offsets.resize(n / 2 * 3);
308+
chars.resize(n / 2 * APPROX_STRING_SIZE * 3);
307309
break;
308310
}
309311
}

dbms/src/Core/Block.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,10 @@ MutableColumns Block::cloneEmptyColumns() const
370370
size_t num_columns = data.size();
371371
MutableColumns columns(num_columns);
372372
for (size_t i = 0; i < num_columns; ++i)
373+
{
373374
columns[i] = data[i].column ? data[i].column->cloneEmpty() : data[i].type->createColumn();
375+
columns[i]->reserveWithStrategy(0, IColumn::ReserveStrategy::ScaleFactor1_5);
376+
}
374377
return columns;
375378
}
376379

dbms/src/Storages/DeltaMerge/ColumnFile/ColumnFileInMemory.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,19 @@ ColumnFile::AppendResult ColumnFileInMemory::append(
123123
max_capacity,
124124
rows,
125125
bytes);
126+
for (size_t i = 0; i < cache->block.columns(); ++i)
127+
{
128+
const auto & cache_col = *cache->block.getByPosition(i).column;
129+
LOG_INFO(
130+
Logger::get(""),
131+
"col i={} name={} type={} rows={} bytes={} alloc_bytes={}",
132+
i,
133+
cache->block.getByPosition(i).name,
134+
cache_col.getName(),
135+
cache_col.size(),
136+
cache_col.byteSize(),
137+
cache_col.allocatedBytes());
138+
}
126139
return AppendResult{true, new_alloc_block_bytes};
127140
}
128141

dbms/src/Storages/DeltaMerge/ColumnFile/tests/gtest_dm_column_file.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
#include <ext/scope_guard.h>
3939
#include <vector>
4040

41+
#include "Storages/DeltaMerge/ColumnFile/ColumnFileInMemory.h"
42+
4143
namespace DB::DM::tests
4244
{
4345

@@ -228,6 +230,35 @@ try
228230
}
229231
CATCH
230232

233+
TEST_P(ColumnFileTest, CreateColumnFileInMemory)
234+
try
235+
{
236+
size_t num_rows_write = 10;
237+
Block block = DMTestEnv::prepareSimpleWriteBlock(0, num_rows_write, false);
238+
for (Int64 i = 0; i < 1000; ++i)
239+
{
240+
auto null_col = ColumnNullable::create(ColumnString::create(), ColumnUInt8::create());
241+
for (size_t j = 0; j < num_rows_write; ++j)
242+
{
243+
null_col->insertDefault();
244+
}
245+
block.insert(ColumnWithTypeAndName{
246+
std::move(null_col),
247+
std::make_shared<DataTypeNullable>(std::make_shared<DataTypeString>()),
248+
fmt::format("field_{}", i),
249+
});
250+
}
251+
// A 1000 columns empty block takes about 238KB
252+
auto schema = ColumnFileSchema(block);
253+
ColumnFileInMemoryPtr cf_in_mem = std::make_shared<ColumnFileInMemory>(std::make_shared<ColumnFileSchema>(schema));
254+
LOG_INFO(
255+
Logger::get(),
256+
"ColumnFileInMemory, bytes={} alloc_bytes={}",
257+
cf_in_mem->getBytes(),
258+
cf_in_mem->getAllocateBytes());
259+
}
260+
CATCH
261+
231262
TEST_P(ColumnFileTest, ReadColumns)
232263
try
233264
{

dbms/src/Storages/DeltaMerge/tests/gtest_segment.cpp

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -665,9 +665,10 @@ TEST_F(SegmentOperationTest, TestMassiveSegment)
665665
try
666666
{
667667
const size_t level = 1;
668+
const size_t segment_range_size = 500;
668669
for (size_t lvl = 0; lvl < level; ++lvl)
669670
{
670-
size_t num_expected_segs = 500;
671+
size_t num_expected_segs = 200;
671672
// size_t num_expected_segs = 10;
672673
size_t progress_interval = 100;
673674
const auto lvl_beg_seg_id = segments.rbegin()->first;
@@ -678,7 +679,7 @@ try
678679
auto next_split_seg_id = lvl_beg_seg_id;
679680
for (size_t i = 0; i < num_expected_segs; ++i)
680681
{
681-
auto split_point = (lvl * num_expected_segs + 1 + i) * 500;
682+
auto split_point = (lvl * num_expected_segs + 1 + i) * segment_range_size;
682683
auto n_seg_id = splitSegmentAt(next_split_seg_id, split_point, Segment::SplitMode::Logical);
683684
ASSERT_TRUE(n_seg_id.has_value()) << fmt::format("i={} sp={}", i, split_point);
684685
next_split_seg_id = *n_seg_id;
@@ -710,7 +711,8 @@ try
710711
if (seg_id < lvl_beg_seg_id)
711712
continue; // skip segments created in previous levels
712713

713-
auto write_rows = 500;
714+
size_t write_rows = 4;
715+
size_t write_rows_sub = 2;
714716
if (round % progress_interval == 0)
715717
{
716718
auto mu = get_process_mem_usage();
@@ -722,29 +724,34 @@ try
722724
write_rows * round,
723725
mu.resident_mb);
724726
}
725-
writeToCache(
726-
seg_id,
727-
write_rows,
728-
/* start_at */ lvl * num_expected_segs * write_rows + round * write_rows,
729-
false,
730-
std::nullopt);
731-
LOG_INFO(
732-
log,
733-
"lvl={} round={} seg_id={} written_rows={} mem_tbl_bytes={}",
734-
lvl,
735-
round,
736-
seg_id,
737-
write_rows,
738-
segments[seg_id]->getDelta()->getTotalCacheBytes());
727+
for (size_t k = 0; k < 2; ++k)
728+
{
729+
writeToCache(
730+
seg_id,
731+
write_rows_sub,
732+
/* start_at */ lvl * num_expected_segs * segment_range_size + round * segment_range_size,
733+
false,
734+
std::nullopt);
735+
LOG_INFO(
736+
log,
737+
"lvl={} round={} k={} seg_id={} written_rows={} mem_tbl_bytes={} mem_tbl_alloc_bytes={}",
738+
lvl,
739+
round,
740+
k,
741+
seg_id,
742+
write_rows,
743+
segments[seg_id]->getDelta()->getTotalCacheBytes(),
744+
segments[seg_id]->getDelta()->getTotalAllocatedBytes());
745+
}
739746
round++;
740747
}
741748
{
742749
auto mu = get_process_mem_usage();
743750
LOG_INFO(
744751
log,
745752
"TestMassiveSegment done, segments.size()={} lvl={} mem_resident_set={:.3f}MB",
746-
lvl,
747753
segments.size(),
754+
lvl,
748755
mu.resident_mb);
749756
}
750757
}

0 commit comments

Comments
 (0)