使用python从文件加速3d数组填充

时间:2019-04-19 12:27:28

标签: python gpu numba point-clouds numba-pro

我正在使用python填充3d数组,每个数组元素代表一个像素。

我需要插入到数组中的值存储在一个很大的.txt文件中 (5600万行,格式如下-x,y,z,r,g,b)

现在我:

  1. 使用零初始化3d数组。

  2. 逐行读取文件。

  3. 每行仅包含前三个元素(x,y,z)。

  4. 根据x和y计算数组位置[i,j]

  5. 如果array [i,j]等于零->插入从文件读取的行

  6. 否则将跳至下一个文件

5600万行需要我大约160秒的时间

如何使用python加快速度? (可以使用gpu)

array = np.zeros((height, width), dtype=np.float32)

with open(point_cloud_file) as pc_file:
    while True:
        line = pc_file.readline()
        if not line:
            break
        nof_read_lines += 1

        new_line = line.strip()
        try:
            x, y, z, _, _, _ = new_line.split(',')
        except:
            nof_skipped_lines += 1
            continue

        # insert to array
        pixel_x = some calculation
        pixel_y = some calculation
        if 0 < pixel_x < width and 0 < pixel_y < height:
            if array[int(pixel_y), int(pixel_x), 0] == 0:
                array[int(pixel_y), int(pixel_x), :] = x, y, z
            else:
                nof_skipped_lines += 1  # pixel already filled with values

1 个答案:

答案 0 :(得分:1)

在这种情况下,readlines()可能会有所帮助 此示例一次读取所有行,然后将整个文件加载到内存中:

a = df['X']
b = df['Y']

a1 = a.values
a2 = a.shift(-1).ffill().values
b1 = b.values[:, None]

arr = (((a1 < b1) & (a2 > b1)) | ((a1 > b1) & (a2 < b1)))
df = pd.DataFrame(arr)
df[np.nan] = True
out = df.idxmax(axis=1) + 1
out = out.mask(out.duplicated())
print (out)
0    2.0
1    NaN
2    3.0
3    NaN
4    NaN
5    6.0
6    NaN
dtype: float64

但是您正在处理大型文本文件,因此可以限制每个循环中的缓冲区使用量

with open('foo') as f:
lines = f.readlines()
for line in lines:
    pass

file.readlines([sizehint]) sizehint是根据文档计数的字节数