加载一个非常大的txt文件并进行转置



我有一个以制表符分隔的.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。我感谢所有在这个问题上帮助我的人。

相关内容

  • 没有找到相关文章

最新更新