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