我正在将一个x,y,z点文件(LAS)读入Python,并遇到了内存错误。 我正在为我正在开展的项目在已知点之间插值未知点。 我开始使用小文件(< 5,000,000个点)进行工作,并且能够轻松读取/写入numpy数组和Python列表。 我收到了更多数据要处理(> 50,000,000个点),现在我的代码因MemoryError而失败。
如何处理这么大量的数据? 我不必一次加载所有数据到内存中,但我需要使用scipy kd-tree查看相邻点。 我使用Python 2.7 32位在64位Windows XP操作系统上。
提前致谢。
编辑:下面发布了代码。 我删除了长时间计算和变量定义的代码。
如何处理这么大量的数据? 我不必一次加载所有数据到内存中,但我需要使用scipy kd-tree查看相邻点。 我使用Python 2.7 32位在64位Windows XP操作系统上。
提前致谢。
编辑:下面发布了代码。 我删除了长时间计算和变量定义的代码。
from liblas import file
import numpy as np
f = file.File(las_file, mode='r')
num_points = int(f.__len__())
dt = [('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('i', 'u2'), ('c', 'u1'), ('t', 'datetime64[us]')]
xyzict = np.empty(shape=(num_points,), dtype = dt)
counter = 0
for p in f:
newrow = (p.x, p.y, p.z, p.intensity, p.classification, p.time)
xyzict[counter] = newrow
counter += 1
dropoutList = []
counter = 0
for i in np.nditer(xyzict):
# code to define P1x, P1y, P1z, P1t
if counter != 0:
# code to calculate n, tDiff, and seconds
if n > 1 and n < scanN:
# code to find v and vD
for d in range(1, int(n-1)):
# Code to interpolate x, y, z for points between P0 and P1
# Append tuple of x, y, and z to dropoutList
dropoutList.append(vD)
# code to set x, y, z, t for next iteration
counter += 1
np.loadtxt
或np.genfromtxt
?如果是的话,它们对于大文件来说相当低效。(不是为了推销我的答案,但这很相关:https://dev59.com/nGox5IYBdhLWcg3wzXel#8964779)你可以编写自己的读取器并使用`fromiter`,或者现在可以直接使用pandas。(Pandas恰好有一个非常高效的空格分隔ascii读取器。) - Joe Kington