Tente isto:
id2 = csv.reader(open(os.path.join(perf_dir,id_files[1])))
h = tuple(next(id2))
create = '''CREATE TABLE id2 (%s varchar, %s int PRIMARY KEY, %s int)''' % h
insert = '''INSERT INTO id2 (%s, %s, %s) VALUES (%%s, %%s, %%s)''' % h
...
cr.executemany(insert, id2)
Passe o comando sql apenas uma vez para todas as linhas. Além da sobrecarga de desempenho de emitir comandos sql adicionais, observe que o tamanho da própria string sql (em bytes) provavelmente supera o tamanho dos dados reais sob teste.
Usar id2 como gerador sem o array também deve evitar carregar todo o conjunto de dados na memória.