我想读取一个28Gb csv文件并打印内容。但是,我的代码:
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.row)] = self.row
def index_row(self, row):
self.row = row
DB.process(self.dbproc, "index.kch")
start_time = datetime.utcnow()
row_counter = 0
ob = IndexInKyoto()
df = dd.read_csv("/Users/aviralsrivastava/dev/levelsdb-learning/10gb.csv", blocksize=1000000)
df = df.compute(scheduler='processes') # convert to pandas
df = df.to_dict(orient='records')
for row in df:
ob.index_row(row)
print("Total time:")
print(datetime.utcnow-start_time)
不起作用。当我运行命令htop
时,我可以看到dask正在运行,但是没有任何输出。也没有创建任何index.kch文件。
我在不使用dask的情况下就做了同样的事情,并且运行良好。我当时使用的是Pandas流式API(chunksize
),但速度太慢,因此我想使用dask。
答案 0 :(得分:1)
df = df.compute(scheduler='processes') # convert to pandas
不要这样做!
您要在单独的流程中加载片段,然后在主流程中将所有要缝合的数据传输到单个数据帧中。这只会增加处理的开销,并在内存中创建数据的副本。
如果您只想(出于某种原因)将每一行打印到控制台,那么使用Pandas流式CSV阅读器(pd.read_csv(chunksize=..)
)将会非常不错。您可以使用Dask的分块来运行它,也许可以提高速度,因为您在读取数据的工作程序中进行打印:
df = dd.read_csv(..)
# function to apply to each sub-dataframe
@dask.delayed
def print_a_block(d):
for row in df:
print(row)
dask.compute(*[print_a_block(d) for d in df.to_delayed()])
请注意,for row in df
实际上是为您提供了列,也许您想增加列数,或者实际上想要以某种方式处理数据。