我编写了一个Python脚本,该脚本读取csv并使用异步和并发将它们插入到Cassandra表中,但是并发比异步要慢。我使用并发的目的是实现并行写入,因此加快了在cassandra中索引csv文件的任务。
使用异步代码:
for df in chunks:
futures = []
df = df.to_dict(orient='records')
chunk_counter += 1
for row in df:
key = str(row["0"])
row = json.dumps(row, default=str)
futures.append(
self.session.execute_async(
insert_sql, [key, "version_1", row]
)
)
# batch.add(insert_sql, (key, "version_1", row))
# self.session.execute(batch)
for future in futures:
self.log.debug(future)
continue
使用并发的代码:
for df in chunks:
futures = []
df = df.to_dict(orient='records')
chunk_counter += 1
for row in df:
key = str(row["0"])
row = json.dumps(row, default=str)
params = (key, row, )
futures.append(
(
insert_sql,
params
)
)
results = execute_concurrent(
self.session, futures, raise_on_first_error=False)
for (success, result) in results:
if not success:
self.handle_error(result) # result will be an Exception
答案 0 :(得分:1)
您没有设置concurrency
的{{1}}参数,默认情况下它使用100。
并发性参数控制将同时执行多少条语句。当
execute_concurrent
设置为 1 或 2 时,建议将其保持在每主机核心连接数乘以连接主机数的100倍以下(请参见Cluster.protocol_version
)。如果超过该数量,事件循环线程可能会尝试阻止新的连接创建,从而严重影响吞吐量。如果protocol_version为 3 或更高,则可以安全地尝试更高级别的并发性。