【问题标题】:Threads to multi search file多搜索文件的线程
【发布时间】:2013-11-10 09:18:32
【问题描述】:

我打开文件:

FILE *fp = fopen("test.txt", "r");

文件如下所示:

cookie    
monster 
test
...

我创建了 10 个线程 pthread_create

每个线程都会在文件中寻找一个字符串。我想将文件分成几部分。

问题

我不想将整个文件读入内存,因为 .txt 文件会很大。 所以我的方法是寻求。所以我会给每个线程一定数量的行来搜索。

所以 Thread1 得到第 1 到 50 行,Thread2 得到第 51 到 101 行,Thread3 得到第 102 到 152 行。

我怎么说先到第 51 行然后到第 102 行,等等?

fseek (fp, 51, SEEK_SET); // 不这样做

【问题讨论】:

    标签: c file pthreads fseek


    【解决方案1】:

    由于每一行的长度可能不同,如果不先读取所有前面的行,您将无法知道它在文件中的位置。因此,您需要在计算换行符时通读文件以了解每行的字节偏移量——如果您决定这样做,请在生成线程之前进行,否则它们将重复这项工作。

    当然,您可以更改行为,以便按字节而不是按行划分文件,并寻找给定的字节偏移量,然后从那里跳到下一个换行符(并允许具有前面字节范围的线程超出其范围直到行尾,以确保覆盖分割线)。

    另外,你需要给每个线程自己的文件句柄,否则一个线程中的操作会影响其他线程中的文件位置。

    【讨论】:

    • 让我和你确认一下。我可以阅读整个文件。每次有新行时,我都可以为该行保存索引。例如:int *index; 然后在循环文件时将索引保存到我的数组中,然后使用它来查找。
    • @MikeJohn 是的,首先建立行偏移索引,然后使用该索引生成线程以进行搜索。
    • 听起来不错。从您推荐的文件中读取整行的有效方法是什么?
    • 也许只是fgets 有一个足够大的缓冲区来容纳假定的最大行长度,并且只需检查缓冲区中的最后一个字符是否有换行符。
    • 或者只是逐字节读取,操作系统可能无论如何都会缓冲它,所以这可能同样好,如果不是更好的话。但是,我仍然建议按字节而不是按行拆分文件,这样您就不必构建索引并且工作可能会更均匀地拆分。
    【解决方案2】:

    每个线程都需要自己的文件句柄。根据线程id和stride启动10个线程,每个线程中fopen,每个线程中fseek

    【讨论】:

    • 我计划这样做,启动线程,fopen,但我如何告诉它寻找正确的位置?有没有办法告诉 fseek 换行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多