Ускорение обработки из файла CSV

У меня есть проект, и мне нужно улучшить его производительность. У меня есть большая база данных Mysql, созданная из огромного файла CSV (100 миллионов строк). Время вставки не является проблемой, но время ответа на запрос очень важно, и иногда запрос с двумя соединениями занимает около 20 часов ...

Чтобы уменьшить это время ответа, я попытался перенести свою базу данных на Cassandra но безуспешно: моя модель данных не соответствует концепциям Cassandra. Тогда я хотел бы попробовать другой способ повышения производительности: Параллельная виртуальная файловая система. Вместо того, чтобы вставить данные в базу данных Mysql и отправить, а затем отправить запрос, я попытался прочитать весь файл csv с многопоточностью и выполнил свои вычисления. Но результат был не очень хорош: 2 мин. 20 сек. Только для 1 000 000 строк.

На данный момент мои вычисления очень просты: в C ++ с API MPI-IO я просто подсчитываю количество различных пар значений из 2 столбцов. Для выполнения этих вычислений я использую хэш-карту, где каждый ключ представляет собой парное значение из файла csv. В конце, Вот небольшой код:

 MPI::Init(argc,argv); 
 cout << " INFO init done" << endl;
 int myrank = MPI::COMM_WORLD.Get_rank(); 
 int numprocs = MPI::COMM_WORLD.Get_size(); 
 get_filename(path_name, myrank);
 cout << " INFO open file : " << path_name << endl;
 MPI::File thefile = MPI::File::Open(MPI::COMM_WORLD, path_name.c_str(), 
                  MPI::MODE_RDONLY, 
                  MPI::INFO_NULL); 
 MPI::Offset offset = 101;
 MPI::Offset limit = thefile.Get_size();
 cout << " INFO go computing" << endl;
 do {
   thefile.Read_at(offset, buf, bufsize, MPI_CHAR, status);
   temp.assign(buf);
   Tokenize(temp,tokens,"\n");
   line.assign(tokens.at(0));
   tokens.clear();

   Tokenize(line,tokens,"\t");
   nidt_count(tokens);
   tokens.clear();
   offset += (line.size() + 1);
 }while(offset < limit);
 count = status.Get_count(MPI_INT);
 cout << "process " << myrank << " reads " << nidt_hash.size() << " nidt" << endl; 

Я работаю на сервере с 4 ядрами, 8 ГБ оперативной памяти. Мои данные находятся на NAS, установленном в NFS или Samba на моем сервере. Я мог бы добавить 2 или 3 сервера для обработки, но на данный момент я просто попробовал небольшой файл (1 миллион строк) на одном сервере для измерения производительности.

Наконец, мои вопросы:

  • Это хороший способ подумать о том, чтобы изменить вид PVFS для моей проблемы? Я хотел бы сказать, что я буду обрабатывать более сложный запрос, например: выберите все строки с определенной датой (диапазон часов) и определенное значение пары из определенных столбцов.
  • Знаете ли вы другие вещи, которые могут помочь мне улучшить обработку из файла csv? Я подумываю использовать Hadoop, Pytables или FasterCSV.

Вот образец моих данных, состоящих из двух CSV-файлов:

Самый большой (100 миллионов строк) состоит из следующих: 0 13.05.2007 15:52:22 33671624244 33672211799 5 с 0 17 ....

  • второй более простой и маленький (90 000), это как словарь, где из code_1 и code_2 я получаю значение с именем CODEVAL:

    CODE_1 CODE_2 CODEVAL

    0 17 VS

    0 34 SS

  • Как вы и ожидали, обычно я создаю 2 таблицы, по одной для каждого файла, и типичный запрос:

    • Выберите CODEVAL, час (дата) КАК HEURE, COUNT (*) КАК NBSMSSOR Из Tables_1 Присоединяйтесь к CODEVAL, используя (CODE_1, CODE_2) Где CODEVAL = 'SS'

    Простите за презентацию, я не знаю, как создать массив.

    10
    задан Tim Post 23 May 2011 в 08:52
    поделиться