Оптимизация сводных табличных данных в C++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Оптимизация сводных табличных данных в C++

Сообщение Anonymous »

Недавно я работаю над векторизацией для оптимизации производительности на C++. На данный момент он использует CSV в качестве данных. Пока что построение этих табличных данных для векторизации на основе считанных данных является узким местом. При CSV-файле размером 430 МБ со спецификацией 1 050 000 x 9 время, затраченное на каждый процесс, составляет (применена оптимизация O2):
  • чтение CSV с помощью RapidCSV — 3,2 секунды ( pandas.read_csv — 4,8 секунды)
  • запись 3D-данных с помощью Eigen::Tensor со значениями из других столбцов, выступающих в качестве индексов — 18,4 секунды (DataFrame.pivot — 1,8 секунды) )
  • Основная функция — 0,9 секунды (с pandas.DataFrame — более 1 часа)
Запись трехмерные данные» — это почти то же самое, что построить сводную таблицу на основе данных CSV с index=datetime_column, columns=category_column,values=data_columns. Хотя моя опорная точка представляет собой простой алгоритм, считывающий уникальные значения из datetime_column и Category_column, а затем записывающий данные с индексом, найденным в datetime_column, Category_column, при циклическом цикле всех данных CSV. Я использую MSVC из VS2022 + CMake для создания программы.
  • Должен ли я использовать некоторые пакеты, которые оптимизируют сводку данных с помощью специального класса табличных данных? Есть ли у кого-нибудь рекомендации из своей практики?
  • Есть ли возможность оптимизации в алгоритме свода данных? Лучший контейнер поиска для поиска по индексу? Меньше промежуточного использования памяти? Или лучший алгоритм для сведения данных?
Ниже приведен соответствующий код:
auto start = std::chrono::high_resolution_clock::now();
rapidcsv::Document doc(filename);
// Stop timing
auto stop = std::chrono::high_resolution_clock::now();
// Calculate the duration
auto duration = std::chrono::duration_cast(stop - start);

logInfo("Time taken by function {}: {} seconds", "rapidcsv read csv", duration.count()/1000000.0);

std::vector datetime_col = doc.GetColumn(datetime_col_name);
std::vector category_col = doc.GetColumn(category_col_name);
std::set unique_datetime(datetime_col.begin(),
datetime_col.end());
std::set unique_security(category_col.begin(),
category_col.end());

BidirectionalMap datetime_axis;
for (auto dt: unique_datetime){
datetime_axis.insert(TradeTime(dt));
}
BidirectionalMap category_axis(unique_category);
BidirectionalMap feature_axis(feature_col_names);
Eigen::Tensor feature_data(datetime_axis.getSize(), security_axis.getSize(), feature_axis.getSize());

// build mapping
std::vector fea_col_index;
fea_col_index.resize(feature_col_names.size());
for(auto fea_col: feature_col_names){
fea_col_index.push_back(feature_axis.getKey(fea_col));
}
start = std::chrono::high_resolution_clock::now();
for(int i=0; ilocator = 0;
};
template
BidirectionalMap(const Container& values) {
this->locator = 0;
for (const auto& value : values) {
this->insert(value);
}
}
int getKey(const Value& value) const {
return this->valueToKey.at(value);
}
Value getValue(const int& key) const {
return this->keyToValue.at(key);
}
int insert(const Value& value) {
// Check if the key already exists
if(this->valueToKey.find(value) != this->valueToKey.end()){
return this->valueToKey.at(value);
}
this->keyToValue[this->locator] = value;
this->valueToKey[value] = this->locator;
++this->locator;
return this->locator-1;
}
int getSize() const {
return this->locator;
}
};



Подробнее здесь: https://stackoverflow.com/questions/787 ... ation-in-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»