【问题标题】:Python multiprocessing bach insert in Cassandra, no performance improved在 Cassandra 中插入 Python 多处理 bach,没有提高性能
【发布时间】:2017-08-02 18:11:41
【问题描述】:

我尝试在单个进程和多进程中进行批量插入,但它们使用的时间相同。我没有得到任何性能改进。 cassandra 的 keyspace 是 SimpleStrategy,我认为它只有一个节点。这些有影响吗?

这是我的多处理代码,你能帮我找出问题所在吗?

lock = Lock()
ID = Value('i', 0)

def copy(x): 

    cluster = Cluster()
    session = cluster.connect('test')
    global lock, row_ID
    count = 0

    insertt = session.prepare("INSERT INTO table2(id, age, gender, name) values(?, ?, ?, ?)")
    batch = BatchStatement()

    for i in x:
        with open(files[i]) as csvfile:
            reader = csv.reader(csvfile, delimiter=',')
            for row in tqdm(reader):
                if count <= 59:
                    with lock:
                        ID.value += 1
                    name_ID = row[1]
                    gender_ID = row[2]
                    age_ID = int(row[3])
                    batch.add(insertt, (ID.value, age_ID, gender_ID, name_ID))
                    count += 1
                else: 
                    count = 0
                    with lock:
                        ID.value += 1
                    name_ID = row[1]
                    gender_ID = row[2]
                    age_ID = int(row[3])
                    batch.add(insertt, (ID.value, age_ID, gender_ID, name_ID))
                    session.execute(batch)
                    batch = BatchStatement()

if __name__ == '__main__':
    start = time.time()
    with Pool() as p:
        p.map(copy, [range(0,6),range(6,12),range(12,18),range(18,24)])
        end = time.time()
        t = end - start
        print(t)

【问题讨论】:

    标签: python cassandra multiprocessing batch-insert


    【解决方案1】:

    批次并不是为了提高性能,实际上恰恰相反。尤其是记录的批次(您在这里使用的)是正常写入成本的 2 倍以上。未记录的批次可能略微提高性能如果批次中的所有数据都属于同一分区。

    在这个特定示例中,您的吞吐量也将受限于 csv 阅读器从磁盘读取的速度。由于它的阻塞可能是对吞吐量的主要影响之一。您还可以使用 executeAsync,这样您就不会在完成前一个批次时阻止构建下一个批次(但在这里再次不应使用批次)。

    【讨论】:

    • 谢谢,我是 Cassandra 的新手。我比较了在一个过程中使用批处理(记录)和不使用批处理所消耗的时间,它实际上节省了大约 4/5 时间。但是当我添加多处理时,它具有相同的性能。所以另一个问题是“我是否以正确的方式使用多处理”?你能给我一些相关的教程链接吗?
    • 如果可能的话,你能直接更正我的代码吗?提前致谢。
    • 如果您从执行更改为执行异步,您会看到更大的差异。您看到批次性能改进的原因是因为您的吞吐量在使用同步请求时被延迟阻塞。通过减少请求数量来减少阻塞延迟(littles law fwiw)。但这样的请求实际上更昂贵且更慢。
    • 我只是在一个进程中尝试了execute_async,它确实提高了性能,节省了1/3时间。但在多处理中,它并没有得到改善。
    • 所以当我使用 INSERT 而不使用批处理时速度低的原因是我的 csv 阅读器可以从磁盘中提取多快,对吧?如果 csv reader 速度够快,batch 无助于提高插入速度,对吧?
    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 2017-08-11
    • 1970-01-01
    • 2010-10-06
    • 2019-03-04
    • 1970-01-01
    • 2014-05-15
    • 2019-02-08
    相关资源
    最近更新 更多