2015-09-17 2 views
1

У меня проблемы с эффективностью с моим внутренним подключением SQLite на 10 ГБ данных в наборе данных.Более эффективное SQLite Внутреннее соединение и многопоточность

Я бегу следующее,

CREATE TABLE merged AS 
    SELECT * FROM xrootd 
    INNER JOIN condor ON 
    SUBSTR(xrootd.[U.mAppInfo], 0, INSTR(xrootd.[U.mAppInfo], '_')) == 
     SUBSTR(condor.User, 6, INSTR(condor.User, '@')) 
    AND abs(xrootd.[F.mOpenTime] - condor.JobStartDate) <= 60; 

Я оставил его работать без временных ограничений на объединение в выходные дни, но не закончил, поэтому я остановил его, чтобы добавить ограничение времени, потому что я был обеспокоен тем, что, возможно, он генерировал огромное количество данных, объясняющих длительное время.

SQL-столбцы похожи,

sqlite> SELECT [U.mAppInfo], [F.mOpenTime] FROM xrootd LIMIT 5; 
U.mAppInfo|F.mOpenTime 
drberry_ST_t-channel_4f_leptonDecays_13TeV_1fv53a_156_1_vrm|1439703600.0 
drberry_QCD_Pt_600to800_TuneCUETP8M1_13TeV_7ys53a_79_1_oLf|1439705100.0 
drberry_ST_t-channel_4f_leptonDecays_13TeV_1fv53a_176_1_uwo|1439703660.0 
drberry_QCD_Pt_800to1000_TuneCUETP8M1_13TeV_r5d9t3_72_1_6S1|1439705050.0 

sqlite> SELECT User, JobStartDate FROM condor LIMIT 5; 
[email protected]|1439764892.0 
[email protected]|1439615574.0 
[email protected]|1439965560.0 
[email protected]|1440081782.0 
[email protected]|1440081527.0 

Есть ли лучший способ сделать это? Я пробовал простой BASH (остановился, потому что оказалось не так просто) и Python (переполнение памяти). Я могу получить данные в формате Root Tree из CERN, но SQLite показался лучше для этого.

Мои идеи

  • сделать новые таблицы с предварительной строки расщепляется, т.е.. все SUBSTR (..., INSTR (...))
  • Получить уникальный список пользователей, которые существуют в обоих и запустить две внутренние соединения
  • То же, что и выше, но для раз
  • SQLite многопоточности, если есть простой способ сделать это

Я бы предпочел не запускать их в течение нескольких дней, не зная, что может работать лучше, но я оставляю его работающим в то же время.

ответ

1

Первое, что выскакивает у меня есть, что у вас есть то, что приравнивает к ИНЕКЕ в вашем JOIN:

AND abs(xrootd.[F.mOpenTime] - condor.JobStartDate) <= 60; 

Попробуйте переставить, что ИНЕКЕ и посмотреть, если он ускоряет вещи:

CREATE TABLE merged AS 
SELECT * 
FROM xrootd 
INNER JOIN condor 
ON SUBSTR(xrootd.[U.mAppInfo], 0, INSTR(xrootd.[U.mAppInfo], '_')) == SUBSTR(condor.User, 6, INSTR(condor.User, '@')) 
WHERE abs(xrootd.[F.mOpenTime] - condor.JobStartDate) <= 60; 

Чтобы дальше нам нужно больше информации.

Какие индексы вы указали?

Точка, которую вы делаете о создании новой таблицы с подстроками, уже рассчитанными звуками стоит, особенно если вы уроните некоторые подходящие индексы.

+0

Каждая запись в таблице имеет уникальный индекс для этой таблицы. Я попробую то, что вы упомянули завтра, и сообщите об этом. Спасибо –

+0

Так что предложение WHERE, вероятно, помогло, я думаю, что основная проблема заключалась в том, что у меня был весь SUBSTR (condor.User, 6, INSTR (condor.User, '@')) неправильно. Второй показатель двойной - разница. т.е. SUBSTR (condor.User, 6, INSTR (condor.User, '@') - 6). Это закончилось через несколько минут. благодаря –

-1

Есть ли лучший способ сделать это? Да, не используйте SQLite, когда ваши данные такие большие. Используйте полнофункциональную СУБД.

Смежные вопросы