首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在键值数据库中进行并行化?

如何在键值数据库中进行并行化?
EN

Stack Overflow用户
提问于 2019-01-12 08:15:34
回答 1查看 259关注 0票数 0

我的意图是对大型csv文件进行版本,因此,我使用键值数据库,其中键将是来自完整行的列,而值将是行本身。例如:

代码语言:javascript
复制
Name, Age, Roll.No
Aviral, 22, 1
Apoorv, 19, 2

如果我将rollno作为键,我的意图是将DB中的键作为rollno(可能是它的散列),值作为完整的行:Aviral, 22, 1

我已经完成了上面的实现,但是为了处理大型csv文件(即使是534M行的20gb文件),速度太慢了。我正在实施达斯克,但它比正常熊猫的顺序流慢。我的疑问是,如何在键值数据库中使用并行插入?

代码语言:javascript
复制
import json
import sys
from datetime import datetime
from hashlib import md5

import dask.dataframe as dd
import dask.multiprocessing
import pandas as pd

from kyotocabinet import *


class IndexInKyoto:

    def hash_string(self, string):
        return md5(string.encode('utf-8')).hexdigest()

    def dbproc(self, db):
        db[self.hash_string(self.key)] = self.row

    def index_row(self, key, row):
        self.row = row
        self.key = key
        DB.process(self.dbproc, "index.kch")

# destination = "/Users/aviralsrivastava/dev/levelsdb-learning/10gb.csv"
destination = "10M_rows.csv"
df = dd.read_csv(destination)
df_for_file_attributes = pd.read_csv(destination, nrows=2)
column_list = list(df_for_file_attributes)

# df = df.compute(scheduler='processes')     # convert to pandas

start_time = datetime.utcnow()
row_counter = 0
ob = IndexInKyoto()

# function to apply to each sub-dataframe
@dask.delayed
def print_a_block(d):
    #for row in d.itertuples(index=False):
    # print(row)
    print("a block called!")
    d = d.to_dict(orient='records')
    for row in d:
        key = str(row["0"])
        row = json.dumps(row, default=str)
        ob.index_row(key, row)

print("Calling compute!")
dask.compute(*[print_a_block(d) for d in df.to_delayed()])
print(datetime.utcnow() - start_time)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-13 06:45:03

kyotocabinet不允许您并行化插入(https://fallabs.com/kyotocabinet/spex.html),每个写入器都会阻塞,直到另一个Writer完成,所以您不能在Kyotocabinet中并行插入,但是Redis将允许这样的插入,以便进一步优化使用Redis管道(https://redis.io/topics/pipelining),这将在加载大量数据的同时对数据进行批量处理,并在很大程度上减少RTT。

您的任务运行速度低于顺序处理的原因是管理多进程顺序写入DB的开销。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54157837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档