【发布时间】:2019-11-12 10:20:22
【问题描述】:
问题在于数据量巨大,我必须使用具有 12GB RAM 的个人笔记本电脑来处理。我尝试了一个 1M 的循环。每一轮都行,并使用 csv.writer。但是 csv.writer 写得像 1M。每两小时排队。那么,还有其他值得尝试的方法吗?
lines = 10000000
for i in range(0, 330):
list_str = []
with open(file, 'r') as f:
line_flag = 0
for _ in range(i*lines):
next(f)
for line in f:
line_flag = line_flag + 1
data = json.loads(line)['name']
if data != former_str:
list_str.append(data)
former_str = data
if line_flag == lines:
break
with open(self.path + 'data_range\\names.csv', 'a', newline='') as writeFile:
writer = csv.writer(writeFile, delimiter='\n')
writer.writerow(list_str)
writeFile.close()
另一个版本
def read_large_file(f):
block_size = 200000000
block = []
for line in f:
block.append(line[:-1])
if len(block) == block_size:
yield block
block = []
if block:
yield block
def split_files():
with open(write_file, 'r') as f:
i = 0
for block in read_large_file(f):
print(i)
file_name = write_name + str(i) + '.csv'
with open(file_name, 'w', newline='') as f_:
writer = csv.writer(f_, delimiter='\n')
writer.writerow(block)
i += 1
【问题讨论】:
-
您能否展示您尝试过的代码,该代码需要 2 小时才能处理一百万行?
-
谢谢,成功了^^
-
我会试试 dask。好的起点:examples.dask.org/dataframes/01-data-access.html
-
你的代码是不必要的
O(N^2),因为你反复重读你已经读过的行。打开文件一次,然后一次循环读取 330 行,然后处理该块。另外,我在任何地方都看不到csv.readline;你似乎有一个 JSONL 输入文件。 -
@Amadan 我尝试了文件内的循环,但我总是得到一个错误,我猜我们在打开文件时无法将数据写入另一个文件?
标签: python pandas csv bigdata readline