求助帖,关于MMA加载几万行的数据问题~!
mathematica吧
全部回复
仅看楼主
level 1
现在手了有个一千万行的数据,txt文本。其中就是两列数据,我想把它加载到MMA中进行积分运算。遇到两个问题:1,数据量大,计算时间长,有没有什么方法可以提高运算速度的?
2,我是使用Import进行加载的数据,是不是对数据长度有限制,我知道这么多数据一起加载肯定费时,所以减少了加载的行数。经过测试,10000行以内的话计算是没有问题,50000行就不可以了,这是为什么?
下面就是我的程序(中间的有一些常数就没贴出来),希望吧主大人出来解答一下~!谢谢各位的帮助
2018年11月09日 00点11分 1
level 1
2018年11月09日 00点11分 2
level 1
代码原文
data = Import["Sigma2_realcm_eventbyevent_2M.txt", "Table"];
avQxy2alpha = {};
Filelength = 1000;
Do[avQxy2alpha = AppendTo[avQxy2alpha, data[[i, 2]]], {i, 1,
Filelength}];
avNalpha = Table[4, 1 + Filelength];
g = 1;
hbar = 197.3;
h = 197.3*2*Pi;
m = 4*938.6;
coe = g/h^3*4 Pi*(2 m)^1.5/2;
q1 = 2.0;
q2 = 8.0 - q1;
A = 1.44*4 Pi*hbar^2*q1*q2/2/m;
avN[V_, T_] :=
coe*V*T^1.5*
NIntegrate[x^0.5/(Exp[x + A/x/V/T^2] - 1), {x, 0, Infinity}];
avQxy2[V_, T_] := (2*m*T)^2*4/15*
NIntegrate[x^2.5/(Exp[x + A/x/V/T^2] - 1), {x, 0, Infinity}]/
NIntegrate[x^0.5/(Exp[x + A/x/V/T^2] - 1), {x, 0, Infinity}];
tab = {{20, 10}};
Do[tab = Append[tab,
Table[{V, T} /.
FindRoot[{avN[V, T] == avNalpha[[i]],
avQxy2[V, T] == avQxy2alpha[[i]]}, {V, 80}, {T, 10}]]], {i, 1,
Filelength}];
a = avNalpha/tab[[;; , 1]];
b = {};
Do[b = Append[b, {tab[[i + 1, 2]], a[[i + 1]]}], {i, 1, Filelength}];
filename = "outdata.txt"
Export["outdata.txt", b, "Table"];
2018年11月09日 01点11分 3
level 1
@xzcyr上面那个导入txt的帖子是你人工置顶的吗??我看到了,谢谢
2018年11月09日 02点11分 4
level 1
学习了,这次用这个语句导入数据,希望运算速度能有所加快
ReadList["ExampleData/numbers", {Number, Number}]
2018年11月09日 03点11分 5
level 1
@xzcyr 我发现我的程序中犯了很重要的致命缺陷,就是使用了Do循环,并且还用到了Append函数,不仅拖慢了程序的运行速度,还增加了内存的压力,请问可以用哪儿些函数替代这两个的作用呢?
2018年11月09日 05点11分 6
level 1
@xzcyr 吧主,你这种教人学习的方式真特殊~!
数据导出我一会试着使用openApend试试,貌似不错,可以每次算出的数据都进行保存,应该可以减少内存的占有率吧。
另外你的那个帖子关于For循环的,我也看了,我正在看Table和Nestwhile看用哪儿个循环比较合适,非常感谢吧主~!!![哈哈]
2018年11月09日 07点11分 7
吧主可是个好疼志哦[真棒][呵呵]
2018年11月10日 11点11分
吧务
level 11
用二进制保存 然后ReadBinaryList读取最快了
2018年11月11日 05点11分 8
1