В настоящее время я работаю над модулем обработки данных,
и мне нужно свернуть несколько идентичных записей с функцией агрегирования.
Например,
Если у нас есть таблица ниже,
---------------------------------
| Dimension1 | Dimension2 | Sum |
---------------------------------
| A | B | 12 |
| A | B | 23 |
| B | C | 42 |
| C | B | 33 |
| C | B | 22 |
---------------------------------
После накопления мы получили
---------------------------------
| Dimension1 | Dimension2 | Sum |
---------------------------------
| A | B | 35 |
| B | C | 42 |
| C | B | 55 |
---------------------------------
Я собрал все идентичные строки, используя хэш-идентификатор, в структуру данных словаря. (например, Hash Map, Tree и т. д.)
Ниже мой код C ++
unsigned int Record::GetHashCode()
{
unsigned int hash = 1;
for(const auto dim : *this)
{
hash = 31*hash + dim.HashCode();
}
return hash;
}
unsigned int Dimension::HashCode()
{
// Just burrowed java's hash function
// Please see https://en.wikipedia.org/wiki/Java_hashCode()
}
void Gatherer::Gather(const vector<Record>& records)
{
for(const auto& record : records)
{
if(table.find(record.GetHashCode()) == table.end())
{
// No this record in table
table[record.GetHashCode()] = record;
}
else
{
table[record.GetHashCode()]["metric"] += record["metric"];
}
}
}
Да, это довольно просто, и это производительность не плохая и не супер хорошая.
Проблема в том, что в ближайшем будущем возможно будет добавлено больше измерений.
Количество измерений будет 80 и более.
Я боюсь, что текущая сборка на основе хеша не подходит для записи большого размера.
Так что я ищу алгоритм свертки лучше, чем мой.
Есть бумага или что-то для быстрого алгоритма свертки?
Любые идеи приветствуются!
Или, если вы заняты, просто подбросьте мне ключевые слова поиска также приветствуется!
Спасибо хорошего дня.
Задача ещё не решена.
Других решений пока нет …