我在python中有点新鲜, 我当前的代码下载csv文件并将其导入cassandra但作为单个线程。有没有办法创建5或10个线程来拆分csv文件(行)并并行读取它并在每个线程中插入一行Cassandra一行? ,我正在尝试创建一个股票交易数据库来存储所有的tick数据库,从而寻找提高代码和方法性能的方法。如果问题听起来有点傻,请忽略我。
conn = requests.get(url, stream=True)
if conn.status_code == 200:
zfile = zipfile.ZipFile(io.BytesIO(conn.content))
zfile.extractall()
with open(csv_file) as csv_d:
csv_content = csv.reader(csv_d)
for row in csv_content:
symbol = row[0]
stype = row[1]
openp = row[2]
highp = row[3]
lowp = row[4]
closep = row[5]
vol = row[8]
dtime = row[10]
cassa.main('load', symbol, dtime, stype, openp, highp, lowp, closep, vol)
csv_d.close()
os.remove(csv_file)
logging.info("csv file processed succesfully")
谢谢&此致
答案 0 :(得分:3)
如果您碰巧使用DataStax Python driver,那么除了同步API之外,它还会为您提供异步API。使用异步API,您可以尝试一系列不同的方法:
您可以在doc中找到更多关于如何处理此问题的想法。
答案 1 :(得分:0)
我在java中这样做的方式(我认为python类似)是使用工作线程池。您可以在单个线程中读取csv文件,但是在for循环中,您将每行调度到线程池中的一个线程。
工作线程会对其单行进行同步插入并返回。
线程池的大小控制着并行运行的插入数量。在某种程度上,工作池越大,整个文件的导入就越快(受到集群最大吞吐量的限制)。
另一种方法是使用单个线程并使用异步模式进行插入。在java中,它被称为executeAsync,它将CQL语句发送给Cassandra并立即返回而不会阻塞,这样就可以获得大量并行运行的插入的相同效果。
您还可以考虑使用" COPY ... FROM' file.csv';" CQL命令。