我有一个以制表符分隔的.txt文件,它将数字保持为矩阵。行数为904652,列数为26600(制表符分隔)。该文件的总大小约为48 GB。我需要将此文件加载为矩阵,并对矩阵进行转置以提取训练和测试数据。我使用的是Python、panda和sklearn
软件包。我的行为500GB内存服务器,但它不足以加载熊猫包。有人能帮我解决我的问题吗?
加载代码部分如下:
def open_with_pandas_read_csv(filename):
df = pandas.read_csv(filename, sep=csv_delimiter, header=None)
data = df.values
return data
如果您的服务器有500GB的RAM,那么使用numpy的loadtxt方法应该没有问题。
data = np.loadtxt("path_to_file").T
它是一个文本文件,这让它变得有点困难。作为第一步,我将用它创建一个二进制文件,其中每个数字都有一个恒定的字节数。它可能还会减小文件大小。
然后,我将进行多次传递,在每次传递中,我将在输出文件中写入N行。
伪代码:
transposed_rows = [ [], .... , [] ] # length = N
for p in range(columns / N):
for row in range(rows):
x = read_N_numbers_from_row_of_input_matrix(row,pass*N)
for i in range(N):
transposed_rows[i].append(x)
for i in range(N):
append_to_output_file(transposed_rows[i])
通过转换为二进制文件,可以从行的中间读取一系列数字。
N应该足够小,以适应内存中的transported_rows(),即N*行应该是合理的。
N应该足够大,这样我们就可以利用缓存。如果N=1,这意味着我们要浪费大量的读取来生成一行输出。
听起来你正在研究基因数据。如果是这样的话,可以考虑使用--transpose和plink,它非常快速:http://pngu.mgh.harvard.edu/~purcell/plink/dataman.shtml#重新编码
我在stackoverflow上找到了一个解决方案(我相信还有更高效、更合乎逻辑的解决方案)。CCD_ 2方法比CCD_ 3和CCD_ 4甚至CCD_。在没有任何修改或压缩的情况下,它只占用了大约274GB。我感谢所有在这个问题上帮助我的人。