使用 Numpy 加载文本时出现内存错误
Memory error when using Numpy load text
当我使用以下代码使用 numpy 加载 csv 文件时
F = np.loadtxt(F,skiprows=1, delimiter=',',usecols=(2,4,6))
MASS = F[:,4]
#print(MASS)
Z = F[:,6]
N = len(MASS)
print(len(MASS))
我收到以下错误
Traceback (most recent call last):
File "C:\Users\Codes\test2.py", line 16, in <module>
F = np.loadtxt(F,skiprows=1, delimiter=',',usecols=(2,4,6))
File "C:\Python34\lib\site-packages\numpy\lib\npyio.py", line 859, in loadtxt
X.append(items)
MemoryError
我有 24Gb 如果物理内存和文件是 2.70Gb 所以我不明白为什么我会收到这个错误。谢谢!
编辑
我也试过像这样加载相同的文件
f = open(F) #Opens file
f.readline() # Strips Header
nlines = islice(f, N) #slices file to only read N lines
for line in nlines:
if line !='':
line = line.strip()
line = line.replace(',',' ') #Replace comma with space
columns = line.split()
tid = columns[2]
m = columns[4]
r = columns[6] # assigns variable to columns
M.append(m)
R.append(r) #appends data in list
TID.append(tid)
print(len(MASS))
又遇到一个内存错误。
Traceback (most recent call last):
File "C:\Users\Loop test.py", line 58, in <module>
M.append(m)
MemoryError
在这种情况下,似乎在构建第一个列表时 运行 内存不足 M
我认为问题是需要连续内存来加载 2.7GB 数据。由于数据结构和语言实用程序,它的内存也很可能超过 2.7。最好使用同一文件的块或使用类似 HDF5 的数据结构。 http://www.h5py.org/
首先,我会检查您实际上使用的是 python 的 64 位版本。在 Windows 上,以 32 位构建结束是很常见的,即使在 64 位系统上也是如此。
尝试:
import platform
print(platform.architecture()[0])
如果您看到 32bit
,那是您的问题。一个 32 位的可执行文件只能寻址 2GB 的内存,所以你永远不能拥有超过 2GB 的数组(或其他对象)。
然而,loadtxt
效率相当低,因为它通过构建 list
然后将其转换为 numpy 数组来工作。您的示例代码做同样的事情。 (pandas.read_csv
效率更高,并且经过高度优化,如果您碰巧有 pandas
。)
A list
是一种内存效率比 numpy 数组低得多的结构。它类似于指针数组。换句话说,列表中的每个项目 都有额外的 64 位。
如果您需要 "leaner" 文本 I/O,您可以使用 numpy.fromiter
对此进行改进。更完整的讨论见Python out of memory on large CSV file (numpy)(无耻插件)。
不过,我不认为你的问题是loadtxt
。我认为这是 python 的 32 位版本。
当我使用以下代码使用 numpy 加载 csv 文件时
F = np.loadtxt(F,skiprows=1, delimiter=',',usecols=(2,4,6))
MASS = F[:,4]
#print(MASS)
Z = F[:,6]
N = len(MASS)
print(len(MASS))
我收到以下错误
Traceback (most recent call last):
File "C:\Users\Codes\test2.py", line 16, in <module>
F = np.loadtxt(F,skiprows=1, delimiter=',',usecols=(2,4,6))
File "C:\Python34\lib\site-packages\numpy\lib\npyio.py", line 859, in loadtxt
X.append(items)
MemoryError
我有 24Gb 如果物理内存和文件是 2.70Gb 所以我不明白为什么我会收到这个错误。谢谢!
编辑
我也试过像这样加载相同的文件
f = open(F) #Opens file
f.readline() # Strips Header
nlines = islice(f, N) #slices file to only read N lines
for line in nlines:
if line !='':
line = line.strip()
line = line.replace(',',' ') #Replace comma with space
columns = line.split()
tid = columns[2]
m = columns[4]
r = columns[6] # assigns variable to columns
M.append(m)
R.append(r) #appends data in list
TID.append(tid)
print(len(MASS))
又遇到一个内存错误。
Traceback (most recent call last):
File "C:\Users\Loop test.py", line 58, in <module>
M.append(m)
MemoryError
在这种情况下,似乎在构建第一个列表时 运行 内存不足 M
我认为问题是需要连续内存来加载 2.7GB 数据。由于数据结构和语言实用程序,它的内存也很可能超过 2.7。最好使用同一文件的块或使用类似 HDF5 的数据结构。 http://www.h5py.org/
首先,我会检查您实际上使用的是 python 的 64 位版本。在 Windows 上,以 32 位构建结束是很常见的,即使在 64 位系统上也是如此。
尝试:
import platform
print(platform.architecture()[0])
如果您看到 32bit
,那是您的问题。一个 32 位的可执行文件只能寻址 2GB 的内存,所以你永远不能拥有超过 2GB 的数组(或其他对象)。
然而,loadtxt
效率相当低,因为它通过构建 list
然后将其转换为 numpy 数组来工作。您的示例代码做同样的事情。 (pandas.read_csv
效率更高,并且经过高度优化,如果您碰巧有 pandas
。)
A list
是一种内存效率比 numpy 数组低得多的结构。它类似于指针数组。换句话说,列表中的每个项目 都有额外的 64 位。
如果您需要 "leaner" 文本 I/O,您可以使用 numpy.fromiter
对此进行改进。更完整的讨论见Python out of memory on large CSV file (numpy)(无耻插件)。
不过,我不认为你的问题是loadtxt
。我认为这是 python 的 32 位版本。