B********t 发帖数: 147 | 1 文件比较小时可以用一个circular buffer,把整个文件读完,最后在buffer里的就是
需要读的内容。
如果文件很大,比如有几十G,有什么好方法呢? |
g*******d 发帖数: 495 | |
B********t 发帖数: 147 | 3 就是说先得从file status里读出文件有多大么?fseek最大只能偏离2G左右,如果几十
G
的文件也没法seek到接近尾端啊。
【在 g*******d 的大作中提到】 : 看多大size,然后seek到大概位置
|
b*******e 发帖数: 6389 | 4 可以从文件最后开始往前seek。
fseek ( pFile , -10 , SEEK_END );
【在 B********t 的大作中提到】 : 文件比较小时可以用一个circular buffer,把整个文件读完,最后在buffer里的就是 : 需要读的内容。 : 如果文件很大,比如有几十G,有什么好方法呢?
|
B********t 发帖数: 147 | 5 那是不是还得给个max_line_size? 不知道tail命令是怎么实现的。如果一行的size大
于了这个max_line_size了 怎么办?
【在 b*******e 的大作中提到】 : 可以从文件最后开始往前seek。 : fseek ( pFile , -10 , SEEK_END );
|
b*******e 发帖数: 6389 | 6 每次读个1024个字节,自己找换行符嘛。
直到找到指定行数,或者到了文件开始位置,结束。
【在 B********t 的大作中提到】 : 那是不是还得给个max_line_size? 不知道tail命令是怎么实现的。如果一行的size大 : 于了这个max_line_size了 怎么办?
|
r*******e 发帖数: 7583 | 7 tail的实现
http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c
467行开始
【在 B********t 的大作中提到】 : 那是不是还得给个max_line_size? 不知道tail命令是怎么实现的。如果一行的size大 : 于了这个max_line_size了 怎么办?
|
B********t 发帖数: 147 | |
c*******1 发帖数: 589 | 9 读system call的manual.
man 2 stat 看文件size.
man 2 lseek.
man 2 read.
至于能不能优化performance, 看具体要求了。 |
w********i 发帖数: 389 | 10 awk ' NR>(FNR-n)' test.txt |
|
|
f********4 发帖数: 988 | 11 tail那个思路很直接啊。。但是它那个function原来就知道文件末尾的位置,如果不知
道,要把指针放在最后之前,还是要把文件读一遍。。那还不如原来那个用circular
buf的思路了吧。。 |
r*****e 发帖数: 792 | 12 这个效率问题取决于OS的文件系统。我不清楚seekg是怎么实现的,但是可以想象
成文件是按block load进来的,所以找ios::end时,应该是按block跳过,而不是
circular array的那样line by line,所以当文件很大时,先找end再往回应该
更高效。当然极端情况下,从end开始有可能performance差,比如在n行的文件里找
最后的n行,往回读是是按byte的,这样就慢多了。
【在 f********4 的大作中提到】 : tail那个思路很直接啊。。但是它那个function原来就知道文件末尾的位置,如果不知 : 道,要把指针放在最后之前,还是要把文件读一遍。。那还不如原来那个用circular : buf的思路了吧。。
|
B**********2 发帖数: 923 | 13 要求用什么语言呢?
Bash的话,直接tail就好了
【在 B********t 的大作中提到】 : 文件比较小时可以用一个circular buffer,把整个文件读完,最后在buffer里的就是 : 需要读的内容。 : 如果文件很大,比如有几十G,有什么好方法呢?
|
B********t 发帖数: 147 | 14 用c或c++。 题目是实现tail命令的-n 和 -f两个功能
【在 B**********2 的大作中提到】 : 要求用什么语言呢? : Bash的话,直接tail就好了
|
k*******2 发帖数: 84 | 15 如果要求输出的N很大,不能fit到memory,是否只能找到起始行后在重新读file?
如果N不是很大的话,是否可以在scan back的时候就将读到的部分buffer起来?
多谢! |
k*******2 发帖数: 84 | 16 貌似从后往前seek这个功能是不portable的?而且万一系统的实现这个功能的方式仍然
是从前往后seek怎么办呢?
http://stackoverflow.com/questions/10164597/how-would-you-imple
这个链接上说从尾行向前seek这个方法只适用于小数据。
我对文件这一块不熟悉。能否解说一下?多谢!
【在 b*******e 的大作中提到】 : 可以从文件最后开始往前seek。 : fseek ( pFile , -10 , SEEK_END );
|