<p>这里有一个不太需要内存的方法来做同样的事情。可能也快一点。(但这对我来说很难确认)</p>
<p>我的计算机没有足够的内存来运行第一个包含这些大文件的程序。这个是这样,但是我仍然需要先创建一个ony tmax的列表(文件的前1/4),然后打印它,然后删除这个列表,以便有足够的内存来存储nmax、tmin和nmin</p>
<p>但这篇文章也说,2018年文件中的nmin都是-999.0。如果这不合理,你能检查一下R代码是怎么解释的吗?我怀疑这只是档案里的东西。另一种可能性当然是,我完全搞错了(我对此表示怀疑)。不过,我也尝试了2017年的文件,但这个文件没有这样的问题:所有tmax、nmax、tmin、nmin都有大约37%-999.0的值</p>
<p>不管怎样,下面是第二个代码:</p>
<pre><code>import os
import struct
# load_data()
# data_store : object to append() data items (floats) to
# num : number of floats to read and store
# datafile : opened binary file object to read float data from
#
def load_data(data_store, num, datafile):
for i in range(num):
data = datafile.read(4) # process one float (=4 bytes) at a time
item = struct.unpack("<f", data)[0] # '<' means little endian
data_store.append(item)
# save_list() saves a list of float's as strings to a file
#
def save_list(filename, datalist):
output = open(filename, "wt")
for item in datalist:
output.write(str(item) + '\n')
output.close()
#### MAIN ####
datafile = open('data.bin','rb')
# Get file size so we can calculate number of points without reading
# the (large) file entirely into memory.
#
file_info = os.stat(datafile.fileno())
# Calculate number of points, i.e. number of each tmax's, nmax's,
# tmin's, nmin's. A point is 4 floats of 4 bytes each, hence number
# of points = file-size / (4*4)
#
num = int(file_info.st_size / 16)
tmax_list = list()
load_data(tmax_list, num, datafile)
save_list("tmax.txt", tmax_list)
del tmax_list # huge list, save memory
nmax_list = list()
load_data(nmax_list, num, datafile)
save_list("nmax.txt", nmax_list)
del nmax_list # huge list, save memory
tmin_list = list()
load_data(tmin_list, num, datafile)
save_list("tmin.txt", tmin_list)
del tmin_list # huge list, save memory
nmin_list = list()
load_data(nmin_list, num, datafile)
save_list("nmin.txt", nmin_list)
del nmin_list # huge list, save memory
</code></pre>