如何一次将一个超大文件读入numpy数组N行

Am1*_*3zA 5 python arrays numpy

我有一个巨大的文件(大约30GB),每行包括2D曲面上一个点的协调。我需要将文件加载到Numpy array:中points = np.empty((0, 2)),并对其进行应用scipy.spatial.ConvexHull。由于文件的大小很大,因此无法立即将其加载到内存中,因此我想将其作为一批N行scipy.spatial.ConvexHull加载,然后应用到一小部分,然后再加载下N行!什么是有效的方法?
发现在python中,您可以islice用来读取文件的N行,但问题是lines_gen生成器对象,它为您提供了文件的每一行,应该在循环中使用,因此我不确定如何转换所述lines_gen成numpy的阵列中的一个有效的方法是什么?

from itertools import islice
with open(input, 'r') as infile:
    lines_gen = islice(infile, N)
Run Code Online (Sandbox Code Playgroud)

我的输入文件:

0.989703    1
0   0
0.0102975   0
0.0102975   0
1   1
0.989703    1
1   1
0   0
0.0102975   0
0.989703    1
0.979405    1
0   0
0.020595    0
0.020595    0
1   1
0.979405    1
1   1
0   0
0.020595    0
0.979405    1
0.969108    1
...
...
...
0   0
0.0308924   0
0.0308924   0
1   1
0.969108    1
1   1
0   0
0.0308924   0
0.969108    1
0.95881 1
0   0
Run Code Online (Sandbox Code Playgroud)

Mr.*_*itt 1

您可以尝试本文中的第二种方法,并通过使用预先计算的行偏移数组(如果适合内存)引用给定行来读取文件。这是我通常用来避免将整个文件加载到内存中的示例:

data_file = open("data_file.txt", "rb") 

line_offset = []
offset = 0

while 1:
    lines = data_file.readlines(100000)
    if not lines:
        break

    for line in lines:
        line_offset.append(offset)
        offset += len(line)

# reading a line
line_to_read = 1
line = ''

data_file.seek(line_offset[line_to_read])   
line = data_file.readline() 
Run Code Online (Sandbox Code Playgroud)