【问题标题】:fread buffer size - I've loads of memory so why not make it huge?fread 缓冲区大小 - 我有很多内存,为什么不让它变得很大呢?
【发布时间】:2016-05-17 04:34:05
【问题描述】:

好吧,我没有学过计算机科学的好处,所以对于那些已经学过的人来说,这可能是一个简单的问题。 基本上正如标题所说,是什么阻止了我创建一个巨大的缓冲区,比 fread() 函数使用的文件大小要大得多。 据我了解,fread() 将返回成功读取的元素总数,因此我可以将缓冲区重新分配回文件大小。

#include <stdio.h>
#include <stdlib.h>


int main () {
    FILE * pFile;
    long lSize;
    char * buffer = NULL;
    size_t result = 0;
    pFile = fopen ( "test.txt" , "r" );
    if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

// memory is cheap!! size:
    lSize = 1000000;
    buffer = (char*) realloc(buffer, (sizeof(char) * lSize));
    if (buffer)
    {
        result += fread(buffer, sizeof(char), 1, pFile);
    }
// copy the file into the buffer:
    result = fread (buffer,1,lSize,pFile);

/* file is now loaded in the memory buffer. Now resize buffer    */
    buffer = (char*) realloc(buffer, (sizeof(char) * result));

// tidy up
    printf("\n%s",buffer);
    free(buffer);
    fclose (pFile);
    return 0;
 }

这只是我所说的一个示例。我假设文件大小是

【问题讨论】:

  • 基本上没有。事实上,为什么要重新分配它?
  • 好吧,只是为了为下一个文件释放内存,基本上就目前而言,我可以获取所有可用内存加载 myfile,然后重新分配以释放该内存。我想我真正想知道的是这种形式的贪婪编程是正确的方式吗?
  • buffer 只是一个缓冲区,你可以选择你想要的分配方式。通常你会使用一个合理的值。为什么要使用巨大的价值?显然没有任何好处。
  • @Shauny 好的,如果应用程序要打开更多文件,当然可以。您的示例应用只打开了一个。
  • @terencehill 显然有。如果可以避免 realloc 调用,就可以避免内存分配和潜在的批量数据复制。

标签: c memory buffer fread


【解决方案1】:

如果整个目标是速度,那么分配一个巨大的缓冲区并将带有fread 的文件读入其中,然后只做处理器密集型的事情,那么这种方法就可以了。

int main (void) {
    FILE *pFile;
    char *buffer;
    size_t result;
    struct stat statbuf;

    if (!stat("test.txt", &statbuf)
    ||  !(pFile = fopen("test.txt", "r")) {fputs ("File error", stderr); return (1);}

    // memory is cheap!!
    if ((buffer= malloc(statbuf.st_size)==0) {fputs ("Memory error", stderr); return (1);}
    result= fread(buffer, 1, lSize, pFile);
    fclose (pFile);
    if (result != statbuf.st_size) {fputs ("Read error", stderr); return (1);}}

    // now use lots of cycles...

    free(buffer);
    return 0;
 }

【讨论】:

    【解决方案2】:

    因为拥有尽可能多的内存更有意义。当您的文件可能只有 5 个字节时,分配 2k B 的堆有什么意义?仅在需要时重新分配内存更有意义。

    #define INITALLOC     16
    #define STEP           8
    typedef long ssize_t;
    
    ssize_t readfile(FILE *fp, char *dynbuf)
    {
        size_t nalloced, n;
        int c;
        char *tmp;
    
        if ((dynbuf = malloc(INITALLOC)) == NULL)
            return -1;
        nalloced = INITALLOC;
    
        for (n = 0; (c = fgetc(fp)) != EOF; dynbuf[n++] = c)
            if (n == nalloced) {
                if ((tmp = realloc(dynbuf, nalloced += STEP) != NULL)
                    dynbuf = tmp;
                else
                    return -1;
            }
        return n;
    }
    

    【讨论】:

    • '仅在需要时重新分配内存更有意义。' - 好的,所以如果你开始分配一个巨大的缓冲区,你可能根本不需要重新分配。
    • @MartinJames 但是分配太多会浪费内存。
    • 这就是我所做的@terencehill
    • 对不起!!!我的错,是你编辑的还是我真的瞎了?删除了错误的评论
    • @terencehill 我想你一编辑就评论了,然后按下编辑按钮
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多