我有一个制表符分隔的.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
答案 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而没有任何修改或压缩。我感谢所有试图在这个问题上帮助我的人。