我試圖執行this answer中給出的解決方案,將我的〜3.3GB ASCII讀取爲ndarray
。指定不同的dtypes,同時使用np.fromiter讀取大型ASCII作爲numpy數組
def iter_loadtxt(filename, delimiter=None, skiprows=0, dtype=float):
def iter_func():
with open(filename, 'r') as infile:
for _ in range(skiprows):
next(infile)
for line in infile:
line = line.rstrip().split(delimiter)
for item in line:
yield dtype(item)
iter_loadtxt.rowlength = len(line)
data = np.fromiter(iter_func(), dtype=[('',np.float),('',np.float),('',np.float),('',np.int),('',np.int),('',np.int),('',np.int)])
data = data.reshape((-1, iter_loadtxt.rowlength))
return data
data = iter_loadtxt(fname,skiprows=1)
現在我想輸入不同dtypes在調用np.fromiter
,希望,如果我的大多數列是:
事實上,當使用這個功能對我的文件,我得到一個MemoryError
整數,而不是浮動我會有足夠的運氣來避免內存問題,但我迄今沒有成功。
我的文件是「多行」X 7列,我想指定以下格式:前三列爲float
,以下爲uint
。我的操作系統是Windows 10 64位,我有8GB的RAM。我正在使用Python 2.7 32位。
我的嘗試是(以下this answer):
data = np.fromiter(iter_func(), dtype=[('',np.float),('',np.float),('',np.float),('',np.int),('',np.int),('',np.int),('',np.int)])
,但我收到TypeError: expected a readable buffer object
EDIT1
由於hpaulj誰提供的解決方案。以下是工作代碼。
def iter_loadtxt(filename, delimiter=None, skiprows=0, dtype=float):
def iter_func():
dtypes = [float, float, float, int, int, int, int]
with open(filename, 'r') as infile:
for _ in range(skiprows):
next(infile)
for line in infile:
line = line.rstrip().split(delimiter)
values = [t(v) for t, v in zip(dtypes, line)]
yield tuple(values)
iter_loadtxt.rowlength = len(line)
data = np.fromiter(iter_func(), dtype=[('',np.float),('',np.float),('',np.float),('',np.int),('',np.int),('',np.int),('',np.int)])
return data
data = iter_loadtxt(fname,skiprows=1)
你的第一個步驟應該是停止使用32位Python和使用64位的Python來代替。這將解鎖機器上的其餘內存。 –
你在一個小文件上測試了這個嗎? 'iter_func'產生一個浮點數據流,不需要按行分組。我懷疑'from_iter'是否可以處理複合dtype。 – hpaulj
@JohnZwinck確實。 Python的64位版本讓我處理整個文件。謝謝。 – umbe1987