【发布时间】:2018-09-27 04:58:37
【问题描述】:
我正在尝试使用
读取我之前在 python 中创建的 csv 文件with open(csvname, 'w') as csvfile:
csvwriter = csv.writer(csvfile, delimiter=',')
csvwriter.writerows(data)
数据是一个随机矩阵,包含大约 30k * 30k 个条目,np.float32 格式。总共大约 10 GB 的文件大小。
一旦我使用这个函数读入文件(因为我已经知道我的矩阵的大小并且 np.genfromtxt 非常慢,此时需要大约 100 GB RAM)
def read_large_txt(path, delimiter=',', dtype=np.float32, nrows = 0):
t1 = time.time()
with open(path, 'r') as f:
out = np.empty((nrows, nrows), dtype=dtype)
for (ii, line) in enumerate(f):
if ii%2 == 0:
out[int(ii/2)] = line.split(delimiter)
print('Reading %s took %.3f s' %(path, time.time() - t1))
return out
阅读该文件大约需要 10 分钟。我使用的硬盘应该能够读取大约 100 MB/s,这会将读取时间减少到大约 1-2 分钟。
任何想法我可能做错了什么?
相关:why numpy narray read from file consumes so much memory? 这就是函数 read_large_txt 的来源。
【问题讨论】:
-
也许我应该补充说我正在使用 if ii%2 == 0: 因为否则我会尝试将空行传递给输出矩阵
-
内存够吗?
-
从读取时间中提取初始化,确保它与文件大小有关。如果 nrows 很大,它可以使用交换
-
是的,我有 120 GB RAM。它确实读取了整个文件,我只是想知道是否有办法更快地做到这一点。
-
也许 split 在 Java 中的实现很糟糕(导致大量字符串分配),请尝试使用 csv 阅读器
标签: python large-files