我正在玩mmap来打开大文件。假设文件的第一行是观察计数。每个观察跨越2行:
Observation ID \n
Variable length number of integers
我正在对这些做一些计算,并希望使用多处理。是否可以使用seek()来寻找行而不是字节偏移量?显然,使用文件中的open方法可以轻松完成,但是,由于我正在使用mmap,我想知道在这种情况下是否可行。
答案 0 :(得分:2)
文件是字节流,而不是行。如果您需要随机访问文件中特定行的开头,则无法知道您将找到它的文件偏移量的先验。无论您是通过mmap()
,pread()
,seek()
还是任何其他方式进行随机访问,都是如此。
解决此问题的唯一方法是在行号和字节偏移之间建立映射。这通常意味着您必须按顺序扫描整个文件。
根据您的具体需要,可能适用其他方法。例如,如果到达目标行数近似足够好并且您知道文件中行的平均长度,也许您可以寻找所需行数乘以平均行长度,并使用yu找到的任何行在那个位置。或者,如果观察ID全部按数字顺序排列,则可以使用字节偏移对文件进行二进制搜索,直到找到所需的行为止。