我在Windows7 32位平台上使用mathematica 8.0.1.0.我尝试导入数据
Import[file,”Table”]
Run Code Online (Sandbox Code Playgroud)
只要文件(文件中的数组)足够小,它就可以正常工作.但是对于更大的文件(38MB)/阵列(9429乘2052),我得到的信息是:
No more memory available. Mathematica kernel has shut down. Try quitting other applications and then retry.
Run Code Online (Sandbox Code Playgroud)
在具有更多主内存的Windows7 64位平台上,我可以导入更大的文件,但我认为有一天,当文件增长/数组有更多行时,我会遇到同样的问题.
所以,我试图找到一个导入大文件的解决方案.在搜索了一段时间之后,我在这里看到了一个类似的问题:处理Wolfram Mathematica中的大数据文件的方法.但似乎我的mathematica知识不足以使建议的OpenRead,ReadList或类似的数据适应我的数据(参见这里的示例文件).问题是我需要文件中数组的其余程序信息,例如某些列和行中的Dimensions,Max/Min,我正在对某些列和每一行进行操作.但是当我使用例如ReadList时,我从来没有得到与我使用Import相同的数组信息(可能是因为我以错误的方式进行).
有人可以给我一些建议吗?我很感激每一个支持!
是好还是坏,Mathematica提供了丰富的结构,让你做控制的非本地传输,其中Return,Catch/ Throw,Abort和Goto.但是,这些非本地控制转移通常与编写需要确保清理代码(如关闭流)运行的强大程序相冲突.许多语言提供了确保清理代码在各种情况下运行的方法; Java有它的finally块,C++有析构函数,Common Lisp有UNWIND-PROTECT,等等.
在Mathematica,我不知道如何完成同样的事情.我有一个部分解决方案,如下所示:
Attributes[CleanUp] = {HoldAll};
CleanUp[body_, form_] :=
Module[{return, aborted = False},
Catch[
CheckAbort[
return = body,
aborted = True];
form;
If[aborted,
Abort[],
return],
_, (form; Throw[##]) &]];
Run Code Online (Sandbox Code Playgroud)
这肯定不会赢得任何选美比赛,但它也只能处理Abort和Throw.特别是,它存在失败Return; 我想如果你Goto在Mathematica中使用这种非本地控制你应得的.
我没有看到这方面的好方法.CheckReturn例如,没有,当你接受它时,它Return具有非常模糊的语义.有缺点我不知道吗?
编辑:问题Return及其定义中的模糊性与其与条件的相互作用有关(在某种程度上它不是Mathematica中的"控制结构").一个例子,使用我的CleanUp表单:
CleanUp[
If[2 == 2,
If[3 == 3,
Return["foo"]]];
Print["bar"],
Print["cleanup"]]
Run Code Online (Sandbox Code Playgroud)
这将返回"foo"而不打印"cleanup".同样,
CleanUp[
baz /.
{bar …Run Code Online (Sandbox Code Playgroud) 在Mathematica中总有几种方法可以做同样的事情.例如,当我使用Condition WReach的解决方案来解决我最近遇到的问题时:
ClearAll[ff];
SetAttributes[ff, HoldAllComplete];
ff[expr_] /; (Unset[done]; True) :=
Internal`WithLocalSettings[Null, done = f[expr],
AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]; Unset[done]]]
Run Code Online (Sandbox Code Playgroud)
但是,我们可以做同样的事情Block:
ClearAll[ff];
SetAttributes[ff, HoldAllComplete];
ff[expr_] :=
Block[{done},
Internal`WithLocalSettings[Null, done = f[expr],
AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]]]]
Run Code Online (Sandbox Code Playgroud)
或者Module:
ClearAll[ff];
SetAttributes[ff, HoldAllComplete];
ff[expr_] :=
Module[{done},
Internal`WithLocalSettings[Null, done = f[expr],
AbortProtect[If[! ValueQ[done], Print["Interrupt!"]]]]]
Run Code Online (Sandbox Code Playgroud)
可能还有其他几种方法可以做到这一点.从内存和CPU使用的角度来看哪种方式最有效(f可能返回非常大的数据数组 - 但可能返回非常小)?
发现试图用来the usual trick重新定义GaussianFilter []:
out[x_]:=Print["(*"<>ToString@x<>"*)"];
(* Redefining Circle[ ] works as expected*)
Unprotect[Circle];
Circle[a_,args__]:=
Block[{$i=True},{"Circle",a}]/;!TrueQ[$i];
Protect[Circle];
out@Circle[{0,1},1,{0,2Pi}]
(*{Circle, {0, 1}}*)
(* Redefining GaussianFilter[ ] does not*)
Unprotect[GaussianFilter];
GaussianFilter[a_,args__]:=
Block[{$j=True},{"GaussianFilter",a}]/;!TrueQ[$j];
Protect[GaussianFilter];
SetDelayed::write: Tag GaussianFilter in GaussianFilter[a_,args__] is Protected>>
Run Code Online (Sandbox Code Playgroud)