From 3482ab7686b8ba142fb98cbb417178fbaf4b4ab2 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Thu, 21 Jun 2012 16:16:58 +0000 Subject: [PATCH] dbms: lazy opening of files [#CONV-2944]. --- dbms/src/Storages/StorageLog.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/dbms/src/Storages/StorageLog.cpp b/dbms/src/Storages/StorageLog.cpp index 21b7e312079..dc89ef330b4 100644 --- a/dbms/src/Storages/StorageLog.cpp +++ b/dbms/src/Storages/StorageLog.cpp @@ -24,8 +24,6 @@ using Poco::SharedPtr; LogBlockInputStream::LogBlockInputStream(size_t block_size_, const Names & column_names_, StorageLog & storage_, size_t mark_number_, size_t rows_limit_) : block_size(block_size_), column_names(column_names_), storage(storage_), mark_number(mark_number_), rows_limit(rows_limit_), rows_read(0) { - for (Names::const_iterator it = column_names.begin(); it != column_names.end(); ++it) - streams.insert(std::make_pair(*it, new Stream(storage.files[*it].data_file.path(), storage.files[*it].marks[mark_number].offset))); } @@ -33,6 +31,13 @@ Block LogBlockInputStream::readImpl() { Block res; + /// Если файлы не открыты, то открываем их. + if (streams.empty()) + for (Names::const_iterator it = column_names.begin(); it != column_names.end(); ++it) + streams.insert(std::make_pair(*it, new Stream( + storage.files[*it].data_file.path(), + storage.files[*it].marks[mark_number].offset))); + for (Names::const_iterator it = column_names.begin(); it != column_names.end(); ++it) { ColumnWithNameAndType column; @@ -47,7 +52,15 @@ Block LogBlockInputStream::readImpl() if (res) rows_read += res.getByPosition(0).column->size(); - + else + { + /** Закрываем файлы (ещё до уничтожения объекта). + * Чтобы при создании многих источников, но одновременном чтении только из нескольких, + * буферы не висели в памяти. + */ + streams.clear(); + } + return res; }