Skip to content

Commit 5187e48

Browse files
committed
don't overgrow writer buffers over requested size
Don't use capacity() as the size estimate for newly allocated buffers as this might lead to exponential buffer growth if there are a lot of objects with a size larger than BUFFER_WRAP triggering an autogrowth every time.
1 parent 02cb32b commit 5187e48

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

lib/generic_writer.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ class SimpleWriterWrap {
1616
public:
1717
SimpleWriterWrap(const char* filename, size_t bufsz=4096*1024)
1818
: writer(filename),
19-
buffer(bufsz < 2*BUFFER_WRAP ? 2*BUFFER_WRAP : bufsz, osmium::memory::Buffer::auto_grow::yes)
19+
buffer(bufsz < 2 * BUFFER_WRAP ? 2 * BUFFER_WRAP : bufsz,
20+
osmium::memory::Buffer::auto_grow::yes),
21+
buffer_size(buffer.capacity()) // same rounding to BUFFER_WRAP
2022
{}
2123

2224
virtual ~SimpleWriterWrap()
@@ -261,8 +263,8 @@ class SimpleWriterWrap {
261263
void flush_buffer() {
262264
buffer.commit();
263265

264-
if (buffer.committed() > buffer.capacity() - BUFFER_WRAP) {
265-
osmium::memory::Buffer new_buffer(buffer.capacity(), osmium::memory::Buffer::auto_grow::yes);
266+
if (buffer.committed() > buffer_size - BUFFER_WRAP) {
267+
osmium::memory::Buffer new_buffer(buffer_size, osmium::memory::Buffer::auto_grow::yes);
266268
using std::swap;
267269
swap(buffer, new_buffer);
268270
writer(std::move(new_buffer));
@@ -271,6 +273,7 @@ class SimpleWriterWrap {
271273

272274
osmium::io::Writer writer;
273275
osmium::memory::Buffer buffer;
276+
size_t buffer_size;
274277
};
275278

276279
#endif // PYOSMIUM_GENERIC_WRITER_HPP

0 commit comments

Comments
 (0)