【发布时间】:2013-03-05 12:23:44
【问题描述】:
我有一个这种格式的几个 GB 的文本文件
0 274 593869.99 6734999.96 121.83 1,
0 273 593869.51 6734999.92 121.57 1,
0 273 593869.15 6734999.89 121.57 1,
0 273 593868.79 6734999.86 121.65 1,
0 273 593868.44 6734999.84 121.65 1,
0 273 593869.00 6734999.94 124.21 1,
0 273 593868.68 6734999.92 124.32 1,
0 273 593868.39 6734999.90 124.44 1,
0 273 593866.94 6734999.71 121.37 1,
0 273 593868.73 6734999.99 127.28 1,
我有一个简单的函数可以在 Windows 上的 Python 2.7 中进行过滤。该函数读取整个文件,选择具有相同idtile 的行(第一列和第二列)并返回点列表(x、y、z 和标签)和idtile。
tiles_id = [j for j in np.ndindex(ny, nx)] #ny = number of row, nx= number of columns
idtile = tiles_id[0]
def file_filter(name,idtile):
lst = []
for line in file(name, mode="r"):
element = line.split() # add value
if (int(element[0]),int(element[1])) == idtile:
lst.append(element[2:])
dy, dx = int(element[0]),int(element[1])
return(lst, dy, dx)
文件超过 32 GB,瓶颈是文件的读取。我正在寻找一些建议或示例以加快我的功能(例如:并行计算或其他方法)。
我的解决方案是将文本文件拆分为图块(使用 x 和 y 位置)。该解决方案并不优雅,我正在寻找一种有效的方法。
【问题讨论】:
-
你能分割文件吗?如果可以的话,您可以通过并行方法实现某些目标,否则不太可能有帮助。此外,即使那样,您也必须使用 SSD 才能提供帮助,因为硬盘驱动器在线性读取时速度最快,而不是四处寻找
-
@entropy。我做到了。我将文件拆分为瓷砖,但我的解决方案并不优雅。我正在寻找更优雅的解决方案。
-
file_filter()在你的程序中被调用了多少次? -
如果你想多次读取这个文件,把作业交给数据库怎么样?
-
@Ber 假设 lts_idtile 是一个 idtile 列表,file_filter() 每次调用 len(lts_idtile)。
标签: python performance optimization