У меня проблемы с эффективностью с моим внутренним подключением 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 многопоточности, если есть простой способ сделать это
Я бы предпочел не запускать их в течение нескольких дней, не зная, что может работать лучше, но я оставляю его работающим в то же время.
Каждая запись в таблице имеет уникальный индекс для этой таблицы. Я попробую то, что вы упомянули завтра, и сообщите об этом. Спасибо –
Так что предложение WHERE, вероятно, помогло, я думаю, что основная проблема заключалась в том, что у меня был весь SUBSTR (condor.User, 6, INSTR (condor.User, '@')) неправильно. Второй показатель двойной - разница. т.е. SUBSTR (condor.User, 6, INSTR (condor.User, '@') - 6). Это закончилось через несколько минут. благодаря –