C++ 如何提高c+中csv的读取速度+;

C++ 如何提高c+中csv的读取速度+;,c++,csv,file,C++,Csv,File,我目前正在做我的项目,但是整个项目浪费了太多的时间 经过一些测试,我发现程序在I/O上花费了太多的时间 因为每个文件都有不同的数据大小,并且我在程序中使用随机元素,所以很难在高级中读取它 希望有人能帮我处理 vector\u csv(字符串s) { 向量arr; 伊斯特林斯德利姆河(s);; 字符串标记; int c=0; while(getline(delim,token,,')) { arr.push_back(令牌); C++; } 返回arr; } 字符串文件名=公司[0]+“_RSI”

我目前正在做我的项目,但是整个项目浪费了太多的时间


经过一些测试,我发现程序在I/O上花费了太多的时间

因为每个文件都有不同的数据大小,并且我在程序中使用随机元素,所以很难在高级中读取它

希望有人能帮我处理

vector\u csv(字符串s)
{
向量arr;
伊斯特林斯德利姆河(s);;
字符串标记;
int c=0;
while(getline(delim,token,,'))
{
arr.push_back(令牌);
C++;
}
返回arr;
}
字符串文件名=公司[0]+“_RSI”+std::to_字符串(RSI[j][24])+“.csv”;

//cout可能的优化:不要直接使用CSV文件,而是一个压缩的缓存版本,一旦加载就可以用zlib(或Poco.Zip,或其他任何东西)解压。
根据您的平均CSV文件内容,这可能会大大减少您需要从磁盘加载的数据量。也许您的整个数据库可以加载到RAM中,一些条目在需要时可以选择性地解压缩

└── your-database/
    ├── file0001.csv
    ├── file0002.csv
    ├── ...
    └── cache/
        ├── file0001.csv.zip
        └── file0001.csv.zip
        └── ...

ifstream
中使用缓冲区。至少MSVC实现在没有缓冲区的情况下表现不佳

   std::vector<char> buffer(256 * 1024);
   std::ifstream inFile(".\\RSI1~256\\" + filename, std::ios::in);
   inFile.rdbuf()->pubsetbuf(buffer.data(), buffer.size());
std::向量缓冲区(256*1024);
std::ifstream infle(“.\\RSI1~256\\”+文件名,std::ios::in);
infle.rdbuf()->pubsetbuf(buffer.data(),buffer.size());

注意-语句必须按照所示的顺序进行,以确保流的缓冲区寿命正确。

首先,进行一些分析,并查看您花费了太多时间的地方

如果您在getline调用中花费了太多时间,您可能希望关注如何将数据放入内存,即通过读取较大的数据块或使用其他技术(操作系统特定的内容、更改文件格式、使用压缩)


如果你在解析器中花了很多时间,那么现在考虑一下,在两遍中解析CSV文件的每一行:首先,你拆分该行(以一种不完全正确的方式),将所有东西写入向量,然后解析向量的每个条目。这会导致大量不必要的内存分配。您可以使用更适合的

\u csv
函数版本,该函数使用
std::from\u chars
进行解析并直接写入向量。

是否可以尝试将其保存为二进制格式?我没有这方面的经验,但可能有助于提高读写速度。这不是一个简单的代码修复。您显示的代码只是将数据推送到向量上。虽然重新分配(当需要调整大小时)需要时间,但对于磁盘访问来说,这是可以忽略的。究竟是什么问题?你想做什么?为什么这个节目“浪费太多时间”?文件访问总是需要时间。除非您向我们展示
\u csv
功能,否则我们无法判断。此外,请检查您测量的是发布版本时间,而不是调试版本时间。如果要进行优化,请尽可能预加载数据。也可能压缩它,而不是使用原始CSV。尝试使用内存映射文件。解压缩也需要(大量)时间。。。就像将文件加载到内存一样。也许他实际上不需要缓存它们,只需要读取一次。当数据不完全是随机噪声,而且你的CPU还不错时,通常放气->存储/发送->膨胀数据会更快。