mana: strategy
This commit is contained in:
parent
76b22c1434
commit
9bdd79e910
1 changed files with 44 additions and 35 deletions
|
@ -141,8 +141,8 @@ struct ProcessingStrategy
|
||||||
virtual void run(ListfileContext &listfileContext, ParserContext &parserContext) = 0;
|
virtual void run(ListfileContext &listfileContext, ParserContext &parserContext) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
size_t process_one_buffer(size_t bufferNumber, ListfileContext &listfileContext,
|
inline size_t process_one_buffer(size_t bufferNumber, ListfileContext &listfileContext,
|
||||||
ParserContext &parserContext)
|
ParserContext &parserContext)
|
||||||
{
|
{
|
||||||
listfileContext.readerHelper.destBuf().clear();
|
listfileContext.readerHelper.destBuf().clear();
|
||||||
auto buffer = mvlc::listfile::read_next_buffer(listfileContext.readerHelper);
|
auto buffer = mvlc::listfile::read_next_buffer(listfileContext.readerHelper);
|
||||||
|
@ -159,6 +159,46 @@ size_t process_one_buffer(size_t bufferNumber, ListfileContext &listfileContext,
|
||||||
return buffer->used();
|
return buffer->used();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct SingleThreadedStrategy: public ProcessingStrategy
|
||||||
|
{
|
||||||
|
void run(ListfileContext &listfileContext, ParserContext &parserContext) override
|
||||||
|
{
|
||||||
|
size_t bufferNumber = 0;
|
||||||
|
size_t totalBytesProcessed = 0;
|
||||||
|
size_t bytesProcessed = 0;
|
||||||
|
const std::chrono::milliseconds ReportInterval(500);
|
||||||
|
mvlc::util::Stopwatch sw;
|
||||||
|
|
||||||
|
auto report = [&]
|
||||||
|
{
|
||||||
|
[](const mvlc::util::Stopwatch sw, size_t bufferNumber, size_t totalBytesProcessed)
|
||||||
|
{
|
||||||
|
auto s = sw.get_elapsed().count() / (1000.0 * 1000.0);
|
||||||
|
auto bytesPerSecond = totalBytesProcessed / s;
|
||||||
|
auto MiBPerSecond = bytesPerSecond / (1u << 20);
|
||||||
|
std::cout << fmt::format("Processed {} buffers, {} bytes. t={} s, rate={} MiB/s\n",
|
||||||
|
bufferNumber, totalBytesProcessed, s, MiBPerSecond);
|
||||||
|
}(sw, bufferNumber, totalBytesProcessed);
|
||||||
|
};
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
bytesProcessed = process_one_buffer(bufferNumber, listfileContext, parserContext);
|
||||||
|
totalBytesProcessed += bytesProcessed;
|
||||||
|
++bufferNumber;
|
||||||
|
|
||||||
|
if (auto elapsed = sw.get_interval(); elapsed >= ReportInterval)
|
||||||
|
{
|
||||||
|
report();
|
||||||
|
sw.interval();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (bytesProcessed > 0);
|
||||||
|
|
||||||
|
report();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
auto f = cmrc::mnode::resources::get_filesystem().open("data/vme_module_data_sources.json");
|
auto f = cmrc::mnode::resources::get_filesystem().open("data/vme_module_data_sources.json");
|
||||||
|
@ -232,43 +272,12 @@ int main(int argc, char *argv[])
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
parserContext->parser.userContext = &mana;
|
parserContext->parser.userContext = &mana;
|
||||||
|
std::unique_ptr<ProcessingStrategy> strategy = std::make_unique<SingleThreadedStrategy>();
|
||||||
|
|
||||||
mana.sinkContext = mana.sink->init();
|
mana.sinkContext = mana.sink->init();
|
||||||
mana.sink->begin_run(mana.sinkContext, mana.runDescriptor.dump().c_str());
|
mana.sink->begin_run(mana.sinkContext, mana.runDescriptor.dump().c_str());
|
||||||
|
|
||||||
size_t bufferNumber = 0;
|
strategy->run(*listfileContext, *parserContext);
|
||||||
size_t totalBytesProcessed = 0;
|
|
||||||
size_t bytesProcessed = 0;
|
|
||||||
const std::chrono::milliseconds ReportInterval(500);
|
|
||||||
mvlc::util::Stopwatch sw;
|
|
||||||
|
|
||||||
auto report = [&]
|
|
||||||
{
|
|
||||||
[](const mvlc::util::Stopwatch sw, size_t bufferNumber, size_t totalBytesProcessed)
|
|
||||||
{
|
|
||||||
auto s = sw.get_elapsed().count() / (1000.0 * 1000.0);
|
|
||||||
auto bytesPerSecond = totalBytesProcessed / s;
|
|
||||||
auto MiBPerSecond = bytesPerSecond / (1u << 20);
|
|
||||||
std::cout << fmt::format("Processed {} buffers, {} bytes. t={} s, rate={} MiB/s\n",
|
|
||||||
bufferNumber, totalBytesProcessed, s, MiBPerSecond);
|
|
||||||
}(sw, bufferNumber, totalBytesProcessed);
|
|
||||||
};
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
bytesProcessed = process_one_buffer(bufferNumber, *listfileContext, *parserContext);
|
|
||||||
totalBytesProcessed += bytesProcessed;
|
|
||||||
++bufferNumber;
|
|
||||||
|
|
||||||
if (auto elapsed = sw.get_interval(); elapsed >= ReportInterval)
|
|
||||||
{
|
|
||||||
report();
|
|
||||||
sw.interval();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (bytesProcessed > 0);
|
|
||||||
|
|
||||||
report();
|
|
||||||
|
|
||||||
mana.sink->end_run(mana.sinkContext, mana.runDescriptor.dump().c_str());
|
mana.sink->end_run(mana.sinkContext, mana.runDescriptor.dump().c_str());
|
||||||
mana.sink->shutdown(mana.sinkContext);
|
mana.sink->shutdown(mana.sinkContext);
|
||||||
|
|
Loading…
Reference in a new issue