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

时间:2016-01-08 21:17:23

标签: python python-2.7 pandas machine-learning scikit-learn

我有一个制表符分隔的.txt文件,它将数字保存为矩阵。行数为904,652,列数为26,600(制表符分隔)。该文件的总大小约为48 GB。我需要将此文件作为矩阵加载,并采用矩阵的转置来提取训练和测试数据。我正在使用Python,pandas和$scriptBlock = { Param($client) $status = "OFFLINE" $isOnline = "OFFLINE" if (Test-Connection -Computer $client -Quiet -Count 1 -Delay 1) { $isOnline = "ONLINE" } ... } foreach ($client in $clients) { Start-Job -Name AdminPWReset -ScriptBlock $scriptBlock -ArgumentList $client } while (Get-Job -State "Running") { Start-Sleep -Milliseconds 100 } Receive-Job -Name AdminPWReset | Out-File C:\test2.txt Remove-Job -Name AdminPWReset 包。我表现出500GB的内存服务器,但用pandas包加载它是不够的。任何人都可以帮我解决我的问题吗?

加载代码部分如下:

sklearn

4 个答案:

答案 0 :(得分:2)

如果您的服务器有500GB的RAM,那么使用numpy的loadtxt方法应该没问题。

data = np.loadtxt("path_to_file").T

答案 1 :(得分:1)

事实上,它是一个文本文件使它变得有点困难。作为第一步,我将创建一个二进制文件,其中每个数字采用恒定的字节数。它可能还会减小文件大小。

然后,我会进行多次传递,并且在每次传递中我会在输出文件中写入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应该足够小以适应内存中的transposed_rows(),即N *行应该是合理的。

N应该足够大,以便我们利用缓存。如果N = 1,这意味着我们浪费了大量的读取来生成单行输出。

答案 2 :(得分:1)

听起来你正在研究基因数据。如果是这样,请考虑使用--transpose with plink,它非常快:http://pngu.mgh.harvard.edu/~purcell/plink/dataman.shtml#recode

答案 3 :(得分:0)

我在stackoverflow上找到了一个解决方案(我相信还有更高效和更合理的解决方案)。 np.fromfile()方法比np.loadtxt()np.genfromtxt()甚至pandas.read_csv()更有效地加载大文件。它只花了大约274 GB而没有任何修改或压缩。我感谢所有试图在这个问题上帮助我的人。