ускорить заполнение 3D-массива из файла с помощью Python - PullRequest
0 голосов
/ 19 апреля 2019

Я заполняю трехмерный массив, используя python, каждый элемент массива представляет пиксель.

Значения, которые мне нужно вставить в массив, хранятся в очень большом .txt файле (56 миллионов строк, отформатированные следующим образом - x, y, z, r, g, b)

сейчас я:

  1. init 3d-массив с нулями.

  2. читать файл построчно.

  3. для каждой строки, содержащей только первые 3 элемента (x, y, z).

  4. вычислить местоположение массива [i, j] из x и y

  5. если массив [i, j] равен нулю -> вставить строку, считанную из файла

  6. иначе перейти к следующему файлу

на 56 миллионов строк у меня уходит около 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 Ответ

1 голос
/ 19 апреля 2019

может быть readlines () поможет в этой ситуации В этом примере прочитайте все строки одновременно и загрузите весь файл в память:

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

но вы имеете дело с большим текстовым файлом, поэтому вы можете ограничить использование буфера в каждом цикле

with open('foo') as f:
    while True:
        lines = f.readlines(8192)
        if not lines:
            break
        for line in lines:
            pass

file.readlines ([sizehint]) sizehint - количество байтов согласно документации

...