Если позволяет память, сохраняйте ваши данные в 2-мерном массиве (действительно в 3D, но я вернусь к этому позже).Этот массив будет проиндексирован с помощью (product_id, time_period).
Если ваша обработка данных позволяет это сделать, каждый элемент 2D-массива может быть аккумулятором новых данных, поэтому вы читаете в элементе данных и затем настраиваетесоответствующий элемент 2D-массива, чтобы отразить его.Если этот метод работает, ваши данные будут обработаны, когда вы закончите читать их.
Если ваша обработка требует, чтобы вы представляли данные из каждого элемента данных одновременно, тогда вы можете сделать каждый элемент вашего 2D-массива списком(это 3-й D).Это может быть список переменной длины, если вы не знаете, сколько записей клиентов будет присутствовать для каждого (product_id, time_period).После того, как вы прочитали свои данные, вам нужно будет вернуться к каждому элементу двумерного массива, чтобы обработать каждый список.То, как вы расположите свой массив и как вы посещаете элементы, будет иметь значение для производительности.Возможно, вы захотите объявить это динамически, но для этого примера
struct element_t element[NUMBER_OF_PRODUCTS][NUMBER_OF_TIME_PERIODS];
// don't forget to initialize these elements to empty
...
for (p = max_product_id; p >= 0; p--) {
for (t = max_time_period; t >= 0; t--) {
process(element[p][t]);
}
}
будет работать лучше, если вы хотите обработать каждый продукт, прежде чем переходить к следующему, потому что.Вы можете поменять местами строку, столбец и циклы объявления, чтобы добиться лучшего попадания в кэш, если вы хотите обработать каждый период времени (для всех продуктов) перед переходом к следующему.
Следует отметить, что это выполняет сортировку дляВы не говорите «сортировать эти данные».
Если память не позволяет, то вы, вероятно, захотите сохранить части ваших данных в файлы, когда вы их читаете. Это будет иметь те же проблемы, что и массив /Упомянутая выше оптимизация циклической организации / попадания в кэш, но она будет увеличена во много раз.В конце чтения ваших основных данных вы захотите иметь возможность обработать все данные из определенного временного файла (возможно, содержащего все данные для данного продукта (xOR за определенный период времени)) перед переходом к следующему.Основная плохая часть попытки сделать это состоит в том, что когда вы читаете данные, очень вероятно, что вам придется иметь дело с невозможностью открыть все временные файлы одновременно.Это может потребовать, чтобы вы нашли способ сделать открытый обмен файлами (такой же, как обмен памятью, за исключением того, что вы меняете местами файлы, а не страницы памяти).Это была бы совсем другая проблема.