我有一个用这种格式的几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,

我有一个简单的函数在Python 2.7的Windows下过滤函数读取整个文件,选择具有相同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)

文件超过32GB,瓶颈是文件的读取。我正在寻找一些建议或例子,以加快我的功能(例如:并行计算或其他方法)。
我的解决方案是将文本文件拆分为平铺(使用x和y位置)。解决方案并不优雅,我正在寻找一种有效的方法。

最佳答案

你的“身份证”似乎是按一定顺序排列的。也就是说,示例数据表明,一旦遍历某个“idtile”并单击下一个,就不可能再次显示具有该“idtile”的行。如果是这种情况,在处理完所需的“idtile”并点击另一个“idtile”后,您可能会中断for循环。从我的头顶上:

loopkiller = false
for line in file(name, mode="r"):
    element = line.split()
    if (int(element[0]),int(element[1])) == idtile:
        lst.append(element[2:])
        dy, dx = int(element[0]),int(element[1])
        loopkiller = true
    elif loopkiller:
        break;

这样,一旦完成了某个“idtile”,就停止了;而在您的示例中,则继续读取,直到文件结束。
如果idtiles以随机顺序出现,也许可以先尝试编写文件的有序版本。
另外,单独计算idtiles的数字可以帮助您更快地遍历文件假设您的idtile是一个由一位数和三位数整数组成的二元组,可能是以下几行:
for line in file(name, mode="r"):
    element = line.split()
    if int(element[0][0]) == idtile[0]:
        if element[1][0] == str(idtile[1])[0]:
            if element[1][1] == str(idtile[1])[1]:
                if element[1][2] == str(idtile[1])[2]:
                    dy, dx = int(element[0]),int(element[1])
                else go_forward(walk)
            else go_forward(run)
         else go_forward(sprint)
     else go_forward(warp)

08-24 22:56