Skip to content

Commit 06d12bf

Browse files
committed
Less allocations in SegmentMerger
1 parent d125e22 commit 06d12bf

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

src/segment_list.zig

+2-2
Original file line numberDiff line numberDiff line change
@@ -209,11 +209,11 @@ pub fn SegmentListManager(Segment: type) type {
209209
var target = try List.createSegment(allocator, self.options);
210210
defer List.destroySegment(allocator, &target);
211211

212-
var merger = SegmentMerger(Segment).init(allocator, segments.value);
212+
var merger = try SegmentMerger(Segment).init(allocator, segments.value, candidate.end - candidate.start);
213213
defer merger.deinit();
214214

215215
for (segments.value.nodes.items[candidate.start..candidate.end]) |segment| {
216-
try merger.addSource(segment.value);
216+
merger.addSource(segment.value);
217217
}
218218
try merger.prepare();
219219

src/segment_merger.zig

+14-9
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ pub fn SegmentMerger(comptime Segment: type) type {
2424
reader: Segment.Reader,
2525
skip_docs: std.AutoHashMapUnmanaged(u32, void) = .{},
2626

27+
pub fn deinit(self: *Source, allocator: std.mem.Allocator) void {
28+
self.reader.close();
29+
self.skip_docs.deinit(allocator);
30+
}
31+
2732
pub fn read(self: *Source) !?Item {
2833
while (true) {
2934
const item = try self.reader.read() orelse return null;
@@ -48,25 +53,25 @@ pub fn SegmentMerger(comptime Segment: type) type {
4853

4954
current_item: ?Item = null,
5055

51-
pub fn init(allocator: std.mem.Allocator, collection: *SegmentList(Segment)) Self {
56+
pub fn init(allocator: std.mem.Allocator, collection: *SegmentList(Segment), num_sources: usize) !Self {
5257
return .{
5358
.allocator = allocator,
5459
.collection = collection,
60+
.sources = try std.ArrayListUnmanaged(Source).initCapacity(allocator, num_sources),
5561
};
5662
}
5763

5864
pub fn deinit(self: *Self) void {
5965
for (self.sources.items) |*source| {
60-
source.reader.close();
61-
source.skip_docs.deinit(self.allocator);
66+
source.deinit(self.allocator);
6267
}
6368
self.sources.deinit(self.allocator);
6469
self.segment.deinit(self.allocator);
6570
self.* = undefined;
6671
}
6772

68-
pub fn addSource(self: *Self, source: *Segment) !void {
69-
try self.sources.append(self.allocator, .{
73+
pub fn addSource(self: *Self, source: *Segment) void {
74+
self.sources.appendAssumeCapacity(.{
7075
.reader = source.reader(),
7176
});
7277
}
@@ -158,7 +163,7 @@ test "merge segments" {
158163
var collection = try SegmentList(MemorySegment).init(std.testing.allocator, 3);
159164
defer collection.deinit(std.testing.allocator, .delete);
160165

161-
var merger = SegmentMerger(MemorySegment).init(std.testing.allocator, &collection);
166+
var merger = try SegmentMerger(MemorySegment).init(std.testing.allocator, &collection, 3);
162167
defer merger.deinit();
163168

164169
var node1 = try SegmentList(MemorySegment).createSegment(std.testing.allocator, .{});
@@ -174,9 +179,9 @@ test "merge segments" {
174179
node2.value.info = .{ .version = 12, .merges = 0 };
175180
node3.value.info = .{ .version = 13, .merges = 0 };
176181

177-
try merger.addSource(node1.value);
178-
try merger.addSource(node2.value);
179-
try merger.addSource(node3.value);
182+
merger.addSource(node1.value);
183+
merger.addSource(node2.value);
184+
merger.addSource(node3.value);
180185

181186
try merger.prepare();
182187

0 commit comments

Comments
 (0)