Для проекта мне приходится иметь дело с набором данных 30 ГБ. Я могу использовать очень мощный суперкомпьютер, который позволил бы мне хранить весь набор данных в оперативной памяти для вычислений на нем (мне понадобился бы весь набор данных для некоторых алгоритмов, которые я должен реализовать). Проблема в том, что загрузка набора данных все еще очень медленная.
Я хотел бы попросить вас о практических предложениях, чтобы ускорить процесс. Моя идея состояла в том, чтобы разделить процесс загрузки на явные потоки C ++ 11, которые будут загружать отдельные порции данных на основе индекса потока. Я также слышал о библиотеке STXXL, которая, однако, кажется, имеет дело с вычислениями вне ядра, следовательно, без загрузки данных в ОЗУ (чего я хотел бы избежать, так как у меня есть необходимая ОЗУ — и я думаю, что могу получить результат быстрее, загрузив на него набор данных).
Профиль. Узнайте, какая часть вашей программы занимает больше всего времени, а затем оптимизируйте эту часть. Все остальное — микрооптимизация.
Возможно, вы захотите разделить вашу программу по крайней мере на 2 потока, может быть 3. Поток 1 отвечает за чтение данных и размещение в буфере. Поток 2 отвечает за выполнение вычислений, включая разбор входного буфера и размещение результатов в выходном буфере. Поток 3 будет брать данные из выходного буфера и отображать их.
Вам может понадобиться несколько входных буферов в зависимости от скорости ввода данных. Два достаточно, три или более, чтобы дать вычислению больше времени. Идея состоит в том, что входной поток заполняет один буфер, а вычислительный поток обрабатывает другой. Когда вычисление закончено, оно начинается со следующего буфера; Аналогично с темой для чтения.
Ваше другое узкое место может получать данные из памяти. Поищите в Интернете «оптимизация кэша данных c ++». Это микрооптимизация, если вы не получаете и не обрабатываете огромные объемы данных.
Других решений пока нет …