Anonymous
Чрезвычайно медленная вставка DB с использованием TurboDBC
Сообщение
Anonymous » 06 июн 2025, 03:00
Я построил Turbodbc 5.1.2 из Source с Simdutf 7.3.0, Python 3.11. При попытке вставить 150 000 строк из 46 столбцов в таблицу MySQL 8.0 InnoDB, TurbodB занимает около 190 -х годов по сравнению с 15 -х с моим существующим методом. Я смоделировал свою попытку после совета здесь в разделе расширенного использования
https://turbodbc.readthedocs.io/en/late ... parameters : написан/>>>>>>>
Код: Выделить всё
options = turbodbc.make_options(
use_async_io=True,
)
conn = turbodbc.connect(
driver="MySQL Driver",
server = get("host"),
port=3306,
uid=get("user"),
pwd=get("pw"),
plugin_dir="/usr/local/lib/plugin",
turbodbc_options = options,
)
cursor = conn.cursor()
cols = str(insert_df.columns).replace("'", "").replace("[", "(").replace("]", ")")
params = "(" + ", ".join(["?" for _ in insert_df.columns]) + ")"
insert_df = insert_df.with_columns(
cs.float().cast(pl.Float64),
cs.integer().cast(pl.Int64)
)
values = [x.to_numpy() for x in insert_df.iter_columns()]
on_duplicate_key_update_stmts = (
str([i + " = VALUES(" + i + ")" for i in insert_df.columns])
.replace("[", "")
.replace("]", "")
.replace("'", "")
)
cursor.executemanycolumns(f"INSERT INTO {table_name} {cols} VALUES {params} ON DUPLICATE KEY UPDATE updated_at = if(coalesce(data_change_hash,0) values(data_change_hash), NOW(),updated_at), updated_at_micro_ts = if(coalesce(data_change_hash,0) values(data_change_hash),NOW(6),updated_at_micro_ts), " + on_duplicate_key_update_stmts + ", modified_at=NOW();", values)
< /code>
Я также попробовал вставку с строкой, например: < /p>
cursor.executemany(f"INSERT INTO {table_name} {cols} VALUES {params} ON DUPLICATE KEY UPDATE updated_at = if(coalesce(data_change_hash,0) values(data_change_hash), NOW(),updated_at), updated_at_micro_ts = if(coalesce(data_change_hash,0) values(data_change_hash),NOW(6),updated_at_micro_ts), " + on_duplicate_key_update_stmts + ", modified_at=NOW();", list(insert_df.to_numpy()))
< /code>
Но это также заняло около 190 -х годов.INSERT INTO schema.table(my, forty, six, column, names, here, ...) VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE updated_at = if(coalesce(data_change_hash,0) values(data_change_hash), NOW(),updated_at), updated_at_micro_ts = if(coalesce(data_change_hash,0) values(data_change_hash),NOW(6),updated_at_micro_ts), col1 = VALUES(col1), col2 = VALUES(col2), ..., modified_at=NOW();
Любая помощь будет очень оценена.
Подробнее здесь:
https://stackoverflow.com/questions/796 ... g-turbodbc
1749168044
Anonymous
Я построил Turbodbc 5.1.2 из Source с Simdutf 7.3.0, Python 3.11. При попытке вставить 150 000 строк из 46 столбцов в таблицу MySQL 8.0 InnoDB, TurbodB занимает около 190 -х годов по сравнению с 15 -х с моим существующим методом. Я смоделировал свою попытку после совета здесь в разделе расширенного использования https://turbodbc.readthedocs.io/en/latest/pages/advanced_usage.html#using-numpy-arrays-as-query-parameters: написан/>>>>>>>[code]options = turbodbc.make_options( use_async_io=True, ) conn = turbodbc.connect( driver="MySQL Driver", server = get("host"), port=3306, uid=get("user"), pwd=get("pw"), plugin_dir="/usr/local/lib/plugin", turbodbc_options = options, ) cursor = conn.cursor() cols = str(insert_df.columns).replace("'", "").replace("[", "(").replace("]", ")") params = "(" + ", ".join(["?" for _ in insert_df.columns]) + ")" insert_df = insert_df.with_columns( cs.float().cast(pl.Float64), cs.integer().cast(pl.Int64) ) values = [x.to_numpy() for x in insert_df.iter_columns()] on_duplicate_key_update_stmts = ( str([i + " = VALUES(" + i + ")" for i in insert_df.columns]) .replace("[", "") .replace("]", "") .replace("'", "") ) cursor.executemanycolumns(f"INSERT INTO {table_name} {cols} VALUES {params} ON DUPLICATE KEY UPDATE updated_at = if(coalesce(data_change_hash,0) values(data_change_hash), NOW(),updated_at), updated_at_micro_ts = if(coalesce(data_change_hash,0) values(data_change_hash),NOW(6),updated_at_micro_ts), " + on_duplicate_key_update_stmts + ", modified_at=NOW();", values) < /code> Я также попробовал вставку с строкой, например: < /p> cursor.executemany(f"INSERT INTO {table_name} {cols} VALUES {params} ON DUPLICATE KEY UPDATE updated_at = if(coalesce(data_change_hash,0) values(data_change_hash), NOW(),updated_at), updated_at_micro_ts = if(coalesce(data_change_hash,0) values(data_change_hash),NOW(6),updated_at_micro_ts), " + on_duplicate_key_update_stmts + ", modified_at=NOW();", list(insert_df.to_numpy())) < /code> Но это также заняло около 190 -х годов.INSERT INTO schema.table(my, forty, six, column, names, here, ...) VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE updated_at = if(coalesce(data_change_hash,0) values(data_change_hash), NOW(),updated_at), updated_at_micro_ts = if(coalesce(data_change_hash,0) values(data_change_hash),NOW(6),updated_at_micro_ts), col1 = VALUES(col1), col2 = VALUES(col2), ..., modified_at=NOW(); [/code] Любая помощь будет очень оценена. Подробнее здесь: [url]https://stackoverflow.com/questions/79655299/extremely-slow-db-insert-using-turbodbc[/url]