Skip to content

Commit 47f1672

Browse files
committed
This fixes a couple of places where we're overallocating.
1. Reserve vocabs while loading arrows into perspective to prevent overgrowth. 2. Free data tables and protobuf messages before processing the table to minimize the concurrent copies of the data in memory. Signed-off-by: Timothy Bess <tim@prospective.dev>
1 parent c25388c commit 47f1672

6 files changed

Lines changed: 140 additions & 95 deletions

File tree

cpp/perspective/src/cpp/arrow_loader.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ using namespace perspective;
138138

139139
ArrowLoader::ArrowLoader() = default;
140140
ArrowLoader::~ArrowLoader() = default;
141+
ArrowLoader::ArrowLoader(ArrowLoader&&) noexcept = default;
141142

142143
t_dtype
143144
convert_type(const std::string& src) {
@@ -484,6 +485,11 @@ copy_array(
484485
t_vocab* vocab = dest->_get_vocab();
485486
std::string elem;
486487

488+
vocab->reserve(
489+
dict->value_data()->size() + dsize, // vocab len + null bytes
490+
dsize
491+
);
492+
487493
for (std::uint64_t i = 0; i < dsize; ++i) {
488494
std::int32_t bidx = offsets[i];
489495
std::size_t es = offsets[i + 1] - bidx;

cpp/perspective/src/cpp/server.cpp

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -682,13 +682,16 @@ ProtoServer::handle_request(
682682
req_env.ParseFromString(data);
683683
std::vector<ProtoServerResp<std::string>> serialized_responses;
684684
std::vector<proto::Response> responses;
685+
686+
auto msg_id = req_env.msg_id();
687+
auto entity_id = req_env.entity_id();
685688
try {
686-
auto resp_msg = _handle_request(client_id, req_env);
689+
auto resp_msg = _handle_request(client_id, std::move(req_env));
687690
for (auto& resp : resp_msg) {
688691
ProtoServerResp<std::string> str_resp;
689692
str_resp.data = resp.data.SerializeAsString();
690693
str_resp.client_id = resp.client_id;
691-
serialized_responses.emplace_back(str_resp);
694+
serialized_responses.emplace_back(std::move(str_resp));
692695
}
693696
} catch (const PerspectiveException& e) {
694697
proto::Response resp;
@@ -718,13 +721,13 @@ ProtoServer::handle_request(
718721
// proto::Response resp_env;
719722
serialized_responses.reserve(responses.size());
720723
for (auto& resp : responses) {
721-
resp.set_msg_id(req_env.msg_id());
722-
resp.set_entity_id(req_env.entity_id());
724+
resp.set_msg_id(msg_id);
725+
resp.set_entity_id(entity_id);
723726

724727
ProtoServerResp<std::string> str_resp;
725728
str_resp.data = resp.SerializeAsString();
726729
str_resp.client_id = client_id;
727-
serialized_responses.emplace_back(str_resp);
730+
serialized_responses.emplace_back(std::move(str_resp));
728731
}
729732

730733
return serialized_responses;
@@ -1148,7 +1151,7 @@ coerce_to(const t_dtype dtype, const A& val) {
11481151
}
11491152

11501153
std::vector<ProtoServerResp<ProtoServer::Response>>
1151-
ProtoServer::_handle_request(std::uint32_t client_id, const Request& req) {
1154+
ProtoServer::_handle_request(std::uint32_t client_id, Request&& req) {
11521155
static bool is_init_expr = false;
11531156
if (!is_init_expr) {
11541157
t_computed_expression_parser::init();
@@ -1157,9 +1160,13 @@ ProtoServer::_handle_request(std::uint32_t client_id, const Request& req) {
11571160

11581161
std::vector<ProtoServerResp<ProtoServer::Response>> proto_resp;
11591162
// proto::Response resp_env;
1163+
1164+
auto msg_id = req.msg_id();
1165+
auto entity_id = req.entity_id();
1166+
11601167
auto push_resp = [&](Response&& resp) {
1161-
resp.set_msg_id(req.msg_id());
1162-
resp.set_entity_id(req.entity_id());
1168+
resp.set_msg_id(msg_id);
1169+
resp.set_entity_id(entity_id);
11631170
ProtoServerResp<ProtoServer::Response> resp2;
11641171
resp2.data = std::move(resp);
11651172
resp2.client_id = client_id;
@@ -1280,32 +1287,42 @@ ProtoServer::_handle_request(std::uint32_t client_id, const Request& req) {
12801287
dims.end_col
12811288
);
12821289

1283-
table = Table::from_arrow(index, *arrow, limit);
1290+
table = Table::from_arrow(index, std::move(*arrow), limit);
12841291
break;
12851292
}
12861293
case proto::MakeTableData::kFromArrow: {
1287-
table =
1288-
Table::from_arrow(index, r.data().from_arrow(), limit);
1294+
std::string data = r.data().from_arrow();
1295+
{ auto _ = std::move(req); }
1296+
1297+
table = Table::from_arrow(index, std::move(data), limit);
12891298
break;
12901299
}
12911300
case proto::MakeTableData::kFromCsv: {
1292-
table = Table::from_csv(index, r.data().from_csv(), limit);
1301+
std::string data = r.data().from_csv();
1302+
{ auto _ = std::move(req); }
1303+
1304+
table = Table::from_csv(index, std::move(data), limit);
12931305
break;
12941306
}
12951307
case proto::MakeTableData::kFromCols: {
1296-
table =
1297-
Table::from_cols(index, r.data().from_cols(), limit);
1308+
std::string data = r.data().from_cols();
1309+
{ auto _ = std::move(req); }
1310+
1311+
table = Table::from_cols(index, std::move(data), limit);
12981312
break;
12991313
}
13001314
case proto::MakeTableData::kFromRows: {
1301-
table =
1302-
Table::from_rows(index, r.data().from_rows(), limit);
1315+
std::string data = r.data().from_rows();
1316+
{ auto _ = std::move(req); }
1317+
1318+
table = Table::from_rows(index, std::move(data), limit);
13031319
break;
13041320
}
13051321
case proto::MakeTableData::kFromNdjson: {
1306-
table = Table::from_ndjson(
1307-
index, r.data().from_ndjson(), limit
1308-
);
1322+
std::string data = r.data().from_ndjson();
1323+
{ auto _ = std::move(req); }
1324+
1325+
table = Table::from_ndjson(index, std::move(data), limit);
13091326
break;
13101327
}
13111328
case proto::MakeTableData::kFromSchema: {
@@ -1327,7 +1344,7 @@ ProtoServer::_handle_request(std::uint32_t client_id, const Request& req) {
13271344
}
13281345
}
13291346

1330-
m_resources.host_table(req.entity_id(), table);
1347+
m_resources.host_table(entity_id, table);
13311348
proto::Response resp;
13321349
resp.mutable_make_table_resp();
13331350
push_resp(std::move(resp));

0 commit comments

Comments
 (0)