由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 巨大的文件怎么transpose? (python)
相关主题
R竟然没有elseif / elif ?[合集] scipy还是matlab
python要把@当作矩阵乘法算符[合集] Python下面如何进行numeric analysis and statistical analysis
Python:请问如何把list变成structured array。python不支持多态
Python小问题如何自学python
Python矩阵一问Python macro question
Python的问题关于python的优势
Python的script的兼容问题python开发大型软件的可能性
python: 怎么避免memory leak?correct indentation in python ?
相关话题的讨论汇总
话题: nn话题: 00话题: ped话题: 11话题: 01
进入Programming版参与讨论
1 (共1页)
i***r
发帖数: 1035
1
我有个20 million row * 100 column的文件
需要transpose,大概如下:
11 11 11 11 11...
22 22 22 22 22...
33 33 33 33 33...
44 44 44 44 44...
55 55 55 55 55...
...
to
1122334455...
1122334455...
我现在用的方法很慢,就是每次读一行2个char,比如 11,存到 string, 然后一行一
行的读,往后面加,1122, 112233, 11223344, 1122334455 等等。最后吧string
打出来。
居然要几个小时。
很早以前写了个bash的,时间应该在半小时以内吧。但是我想用python做。请问:
1) 这么慢是因为 不停往后面加东西吗?
2) 怎么变快?
X****r
发帖数: 3557
2
干吗加字符串,一边读一边打出来不就完了,一百列就重复一百遍。

【在 i***r 的大作中提到】
: 我有个20 million row * 100 column的文件
: 需要transpose,大概如下:
: 11 11 11 11 11...
: 22 22 22 22 22...
: 33 33 33 33 33...
: 44 44 44 44 44...
: 55 55 55 55 55...
: ...
: to
: 1122334455...

v*******e
发帖数: 11604
3
估计你这个是genome data吧,用 plink 转,很快的。
i***r
发帖数: 1035
4
是genome data
还不知道plink怎么弄呢。。。这个ped就是plink的。
PED文件怎么搞成一长排,连less command看起来都好慢,一行就是20million。。。
我主要是想,直接python处理就完了,没想到今天居然跑了好几个小时才跑完

【在 v*******e 的大作中提到】
: 估计你这个是genome data吧,用 plink 转,很快的。
i***r
发帖数: 1035
5
我已开始也想一边读一边打。
不知道频繁的 io读写 会不会更慢? 我有空了试试。
但是我那样不断往string后面加长,估计会频繁relocate memory,更慢?

【在 X****r 的大作中提到】
: 干吗加字符串,一边读一边打出来不就完了,一百列就重复一百遍。
X****r
发帖数: 3557
6
python的string是immutable的,所以在字符串后面不断加长就会不断分配新的字符串
。一般的做法是用个list,每次把新字符串放到list的最后,完了一个join。

【在 i***r 的大作中提到】
: 我已开始也想一边读一边打。
: 不知道频繁的 io读写 会不会更慢? 我有空了试试。
: 但是我那样不断往string后面加长,估计会频繁relocate memory,更慢?

v*******e
发帖数: 11604
7

plink直接就有命令来transpose ped文件,产生tped文件。自己去plink网页上搜tped
。python不是万能的,自己编写程序容易出错,费时费力,已经有的工具用好就行了。

【在 i***r 的大作中提到】
: 是genome data
: 还不知道plink怎么弄呢。。。这个ped就是plink的。
: PED文件怎么搞成一长排,连less command看起来都好慢,一行就是20million。。。
: 我主要是想,直接python处理就完了,没想到今天居然跑了好几个小时才跑完

i***r
发帖数: 1035
8
确实,已有的工具可靠,速度快。。。

tped

【在 v*******e 的大作中提到】
:
: plink直接就有命令来transpose ped文件,产生tped文件。自己去plink网页上搜tped
: 。python不是万能的,自己编写程序容易出错,费时费力,已经有的工具用好就行了。

i***r
发帖数: 1035
9
有道理,我有空了benchmark一下,看差别多大

【在 X****r 的大作中提到】
: python的string是immutable的,所以在字符串后面不断加长就会不断分配新的字符串
: 。一般的做法是用个list,每次把新字符串放到list的最后,完了一个join。

p**o
发帖数: 3409
10
贴代码,我帮你看看

【在 i***r 的大作中提到】
: 我有个20 million row * 100 column的文件
: 需要transpose,大概如下:
: 11 11 11 11 11...
: 22 22 22 22 22...
: 33 33 33 33 33...
: 44 44 44 44 44...
: 55 55 55 55 55...
: ...
: to
: 1122334455...

相关主题
Python的问题[合集] scipy还是matlab
Python的script的兼容问题[合集] Python下面如何进行numeric analysis and statistical analysis
python: 怎么避免memory leak?python不支持多态
进入Programming版参与讨论
k**********g
发帖数: 989
11

http://wiki.python.org/moin/PythonSpeed/PerformanceTips#String_

【在 i***r 的大作中提到】
: 有道理,我有空了benchmark一下,看差别多大
i***r
发帖数: 1035
12
代码:
import sys
pop=98
def ped(genotype):
if genotype=='00':
ped='1 1 '
elif genotype=='01':
ped='1 2 '
elif genotype=='10':
ped='2 1 '
elif genotype=='11':
ped='2 2 '
else:
ped='0 0 '
return ped
def write_ped(filename,out):
fn=open(filename,'r')
fn_ped=open(out+'.ped','w')
fn_map=open(out+'.map','w')
modern_human=range(9,93) # 15+69
for ind in modern_human:
ind_genotype=''
fn.seek(0,0)
for line in fn.readlines():
lis=line[:-1].split("\t")
if len(lis) == (pop-1): # if 1 col less, then missing UCSC ref
lis.insert(8, "sw") # add junk
assert (len(lis) == pop)
ind_genotype += ped(lis[ind])
if ind==min(modern_human): # map file needs print only once
print(map(lis), file=fn_map)
print(ind_genotype, file=fn_ped)
fn.close()
fn_ped.close()
fn_map.close()

if __name__=="__main__":
if len(sys.argv)< 3:
print("Usage: %s " % sys.argv[0], file=sys.stderr)
sys.exit("Missing input file")
write_ped(sys.argv[1],sys.argv[2])

【在 p**o 的大作中提到】
: 贴代码,我帮你看看
c*********e
发帖数: 16335
13
把数据先存到内存里,再在内存里做些数学操作。内存多大?

【在 i***r 的大作中提到】
: 我有个20 million row * 100 column的文件
: 需要transpose,大概如下:
: 11 11 11 11 11...
: 22 22 22 22 22...
: 33 33 33 33 33...
: 44 44 44 44 44...
: 55 55 55 55 55...
: ...
: to
: 1122334455...

i***r
发帖数: 1035
14
input 文件的某1行,共22million
chr1 46669 46670 snp 11 + A G dbsnp.100:rs2548905
00 00 00 00 01 01 11 NN NN 11 01 NN 00
NN NN NN 00 00 00 00 00 11 NN 11 01
11 01 NN 00 00 00 11 NN 00 01 NN NN 00
00 00 NN 00 00 NN 01 00 11 NN 00 NN 01
01 NN 11 00 NN 11 NN 00 00 NN 00 01
01 NN NN 11 01 11 11 11 11 11 01 NN 11
01 NN 11 00 11 11 01 11 a N a a N

【在 p**o 的大作中提到】
: 贴代码,我帮你看看
i***r
发帖数: 1035
15
内存有250G
这个文件7G,实际操作大概占用2~3G?

【在 c*********e 的大作中提到】
: 把数据先存到内存里,再在内存里做些数学操作。内存多大?
c*********e
发帖数: 16335
16
那就在内存里做数学操作。

【在 i***r 的大作中提到】
: 内存有250G
: 这个文件7G,实际操作大概占用2~3G?

w***g
发帖数: 5958
17
20 million row * 100 column, 即使存成text的话也就10G吧, 这种操作bottleneck在
磁盘, 假设100MB/s的话差不多读入2分钟, 写出2分钟, 无论如何10分钟应该够了啊.
你用numpy搞个大数组, 直接转置了输出难道有问题吗?

【在 i***r 的大作中提到】
: 我有个20 million row * 100 column的文件
: 需要transpose,大概如下:
: 11 11 11 11 11...
: 22 22 22 22 22...
: 33 33 33 33 33...
: 44 44 44 44 44...
: 55 55 55 55 55...
: ...
: to
: 1122334455...

w****w
发帖数: 521
18
你这个文件扫了快90次,当然慢了。根据内存多少要多列一起转置,而不是一列。你有
这么大内存,只要建个大矩阵,扫一次就可以了。而且你这里完全不用转置,直接产生
tped/tfam文件,而不是ped/map文件。
n******t
发帖数: 4406
19
这个帖子深刻的说明了,学语言如果只学这种所谓高级语言,是没法写任何能用的大型
系统的。

【在 w****w 的大作中提到】
: 你这个文件扫了快90次,当然慢了。根据内存多少要多列一起转置,而不是一列。你有
: 这么大内存,只要建个大矩阵,扫一次就可以了。而且你这里完全不用转置,直接产生
: tped/tfam文件,而不是ped/map文件。

e**********y
发帖数: 128
20
read into a numpy array using method --http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html
then call transpose method on this numpy array.
a = numpy.fromfile(file)
a.transpose()
相关主题
如何自学pythonpython开发大型软件的可能性
Python macro questioncorrect indentation in python ?
关于python的优势很沮丧地问一个非常土的python问题
进入Programming版参与讨论
r****t
发帖数: 10904
21
reads like c code. why not directlly write in c.

【在 i***r 的大作中提到】
: 代码:
: import sys
: pop=98
: def ped(genotype):
: if genotype=='00':
: ped='1 1 '
: elif genotype=='01':
: ped='1 2 '
: elif genotype=='10':
: ped='2 1 '

c*******y
发帖数: 1630
22
小猴子危言耸听了,哈哈。

【在 n******t 的大作中提到】
: 这个帖子深刻的说明了,学语言如果只学这种所谓高级语言,是没法写任何能用的大型
: 系统的。

x****u
发帖数: 44466
23
mmap

【在 c*********e 的大作中提到】
: 把数据先存到内存里,再在内存里做些数学操作。内存多大?
1 (共1页)
进入Programming版参与讨论
相关主题
correct indentation in python ?Python矩阵一问
很沮丧地问一个非常土的python问题Python的问题
求python大牛指路Python的script的兼容问题
别人说做Python的并行还不如去学C++,我不同意。python: 怎么避免memory leak?
R竟然没有elseif / elif ?[合集] scipy还是matlab
python要把@当作矩阵乘法算符[合集] Python下面如何进行numeric analysis and statistical analysis
Python:请问如何把list变成structured array。python不支持多态
Python小问题如何自学python
相关话题的讨论汇总
话题: nn话题: 00话题: ped话题: 11话题: 01