我有一个包含 n 个“记录”的大文件(用 Mathematica 编写),每个记录都是一个固定长度 m 的列表,其中 n > 10,000 和 500 < m < 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];
如果可以消除第二遍(获取字节偏移量)会很好,但我还没有找到如何做到这一点......此外,这些字节偏移量可以写入文件(类似于记录的处理方式) 然后一次读回一个,如果仍然存在内存问题。