Si bien bulk_create es útil para guardar una pequeña cantidad de registros mientras se procesa un formulario HTML, no es ideal para guardar miles de registros. Como ya ha descubierto, es lento porque necesita mucha memoria y envía una consulta muy grande a la base de datos. Fortunatley CARGAR DATOS EN ARCHIVO viene al rescate.
Podemos producir un archivo similar al que se produce usando escritor csv el siguiente ejemplo es de la documentación.
import csv
with open('some.csv', 'wb') as f:
writer = csv.writer(f)
writer.writerows(someiterable)
Finalmente, como ya se habrá dado cuenta, la opción LOCAL para CARGAR DATOS... a veces se puede usar por conveniencia.
Al usar esta opción, no es necesario transferir el archivo manualmente al servidor. Puede generar el archivo CSV en el lado del cliente y la opción local hará que el cliente mysql transfiera automáticamente el archivo al servidor.