我有一个包含n个“记录”的大文件(用Mathematica编写),这些记录中的每一个都是固定长度为m的列表,其中n> 10,000和500 < m&lt; 600(字节)。注意,我的系统没有能力将所有记录保存在内存中 - 将它们写入文件的原因。我有一个应用程序(在Mathematica中)需要以相反的顺序处理这些记录;即写出的最后一条记录是要处理的第一条记录。如何以相反的顺序从文件中读取这些记录?
同时(经过Mathematica I / O的一些试验和错误)后,我找到了一个解决方案。请注意,这是一个可能解决方案的精简示例。
fname = "testfile";
strm = OpenWrite[fname];
n = 10; (* In general, n could be very large *)
For[k = 1, k <= n, k++,
(* Create list on each pass through this loop ... *)
POt = {{k, k + 1}, {k + 2, k + 3}};
Print[POt];
(* Save to a file *)
Write[strm, POt];
];
Close[strm];
(* 2nd pass to get byte offsets of each record written to file *)
strm = OpenRead[fname];
ByteIndx = {0};
For[i = 1, i <= n, i++,
PIn = Read[strm];
AppendTo[ByteIndx, StreamPosition[strm]];
];
Drop[ByteIndx, -1]
(* Read records in reverse order *)
For[i = n, i >= 1, i--,
SetStreamPosition[strm, ByteIndx[[i]]];
PIn = Read[strm];
Print[PIn];
(* Process PIn ... *)
];
Close[strm];
如果第二遍(获得字节偏移)可以被消除但是我还没有找到如何做到这一点会很好...而且,这些字节偏移可以写入文件(类似于如果仍然存在内存问题,则一次一个地回读记录。
答案 0 :(得分:0)
为了给出答案,你的第二遍可以简明扼要地写出来:
strm = OpenRead[fname];
ByteIndx=Reap[While[Sow[StreamPosition[strm]]; !TrueQ[Read[strm ] == EndOfFile]]][[2,1,;;-2]]
n=Length[ByteIndx]