为什么读取 python 中的大文件这么慢?
Why is reading large files in python so slow?
我正在尝试使用
读取我之前在 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 的来源。
我找到了一个非常简单的解决方案。由于我也在创建这些文件,因此我不需要将它们另存为 .csv 文件。将它们加载为 .npy 文件的方式(!)更快:
加载(包括用“,”分隔每一行)存储为 .csv 的 30k * 30k 矩阵大约需要 10 分钟。对存储为 .npy 的矩阵执行相同操作大约需要 10 秒!
这就是为什么我必须将上面写的代码更改为:
np.save(npyname, data)
并在另一个脚本中
out = np.load(npyname + '.npy')
此方法的另一个优点是:(在我的例子中).npy 文件的大小只有 .csv 文件的大约 40%。 :)
我正在尝试使用
读取我之前在 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 的来源。
我找到了一个非常简单的解决方案。由于我也在创建这些文件,因此我不需要将它们另存为 .csv 文件。将它们加载为 .npy 文件的方式(!)更快:
加载(包括用“,”分隔每一行)存储为 .csv 的 30k * 30k 矩阵大约需要 10 分钟。对存储为 .npy 的矩阵执行相同操作大约需要 10 秒!
这就是为什么我必须将上面写的代码更改为:
np.save(npyname, data)
并在另一个脚本中
out = np.load(npyname + '.npy')
此方法的另一个优点是:(在我的例子中).npy 文件的大小只有 .csv 文件的大约 40%。 :)