其他分享
首页 > 其他分享> > c – 如何在32位系统上读取4GB文件

c – 如何在32位系统上读取4GB文件

作者:互联网

在我的情况下,我有不同的文件让我们假设我有> 4GB文件的数据.我想逐行读取该文件并处理每一行.我的一个限制是软件必须在32位MS Windows上运行,或者在64位上运行少量RAM(最小4GB).您还可以假设这些行的处理不是瓶颈.

在当前的解决方案中,我通过ifstream读取该文件并复制到某个字符串.这是片段的样子.

std::ifstream file(filename_xml.c_str());
uintmax_t m_numLines = 0;
std::string str;
while (std::getline(file, str))
{
    m_numLines++;
}

好的,这是有效的,但在这里慢慢地是我的3.6 GB数据的时间:

real    1m4.155s
user    0m0.000s
sys     0m0.030s

我正在寻找一种比这快得多的方法,例如我发现How to parse space-separated floats in C++ quickly?和我喜欢用boost :: mapped_file提出的解决方案,但我面临另一个问题,如果我的文件是大的,在我的情况下文件1GB大足以让整个过程失败.我必须关心内存中的当前数据,可能使用该工具的人没有安装超过4 GB的RAM.

所以我发现了来自boost的mapped_file但是在我的情况下如何使用它?是否可以部分读取该文件并接收这些行?

也许你有另一个更好的解决方案.我必须处理每一行.

谢谢,
巴特

解决方法:

很高兴看到你在How to parse space-separated floats in C++ quickly?找到我的基准

看来你真的在寻找最快的计算线数(或任何线性单程分析),我已经完成了类似的分析和基准

> Fast textfile reading in c++

有趣的是,您会发现性能最高的代码根本不需要依赖内存映射.

static uintmax_t wc(char const *fname)
{
    static const auto BUFFER_SIZE = 16*1024;
    int fd = open(fname, O_RDONLY);
    if(fd == -1)
        handle_error("open");

    /* Advise the kernel of our access pattern.  */
    posix_fadvise(fd, 0, 0, 1);  // FDADVICE_SEQUENTIAL

    char buf[BUFFER_SIZE + 1];
    uintmax_t lines = 0;

    while(size_t bytes_read = read(fd, buf, BUFFER_SIZE))
    {
        if(bytes_read == (size_t)-1)
            handle_error("read failed");
        if (!bytes_read)
            break;

        for(char *p = buf; (p = (char*) memchr(p, '\n', (buf + bytes_read) - p)); ++p)
            ++lines;
    }

    return lines;
}

标签:32-bit,c,boost,large-files,data-processing
来源: https://codeday.me/bug/20190722/1506371.html