【问题标题】:Efficiently reading and writing mixed data types in C++-11 [closed]在 C++-11 中高效读写混合数据类型 [关闭]
【发布时间】:2017-02-18 13:49:41
【问题描述】:

在 C++ 文件中写入和读取混合数据类型(即无符号整数、双精度、uint64_t、字符串)的有效方法。

我需要在磁盘上写入和读取包含混合数据类型的数据。我使用以下方法写入数据。然而,它变得非常缓慢。

fstream myFile;
myFile.open("myFile", ios::binary, ios::out);
double x; //with appropriate initialization
myFile<<x;
int y;
myFile<<y;
uint64_t z;
myFile<<z;
string myString;
myFile<<myString;

但是,对于 20 GB 的大数据,这种方法效率非常低。有人可以建议我如何在 C++ 中快速读写混合数据类型

【问题讨论】:

  • 如果您打算解析 20 GB 的数据,您可能应该从基础开始研究如何有效地完成该任务。你有同事可以帮助你吗?
  • @LightnessRacesinOrbit 不幸的是没有
  • 那么,请原谅我这么说,看来您和您的团队不适合这项任务。你是怎么背上它的?
  • 我以前没有尝试过这样的事情。这是否比仅写入具有相同字节数的整数数组要慢? io 是缓冲的,所以我猜数据的类型并不重要。所有类型的数据都只是字节。你如何读/写文件?您需要按索引插入/删除/访问吗?是不是像一张表,其中每一行都包含一个 int、一个 uint64_t 和一个字符串? stackoverflow.com/questions/10770675/…

标签: c++ c++11


【解决方案1】:

我认为您需要确定的第一件事是您的程序实际上是否很慢。

这是什么意思?你当然认为它很慢,但它很慢是因为你的特定程序效率低下,还是仅仅因为将 20 GB 数据写入磁盘是一项固有的耗时操作?

所以我要做的第一件事是在您的硬盘上运行一些基准测试以确定其原始速度(以兆字节/秒或其他为单位)。有商业应用程序可以做到这一点,或者您可以使用内置实用程序(如 Unix 或 Mac 上的 dd)大致了解您的特定硬盘驱动器读取或写入 20 GB 的数据需要多长时间虚拟数据:

dd if=/dev/zero of=junk.bin bs=1024 count=20971520

dd if=junk.bin of=/dev/zero bs=1024

如果dd(或其他)能够比您的程序传输数据的速度明显更快,那么您的程序还有改进的空间。另一方面,如果dd 的速度并不比你的程序的速度快多少,那么除了购买更快的硬盘驱动器(或者可能是 SSD 或 RAM 驱动器或其他东西)之外,你无能为力.

假设上述测试确实表明您的程序效率低于预期,我会尝试的第一件事是将您的 C++ iostream 调用替换为使用 C fopen()/fread()/fwrite()/fclose() API 调用的等效实现。一些 C++ iostream 实现是known to be somewhat inefficient,但(更简单的)C I/O API 不太可能效率低下。如果不出意外,比较 C++ 和 C 版本的性能可以让您确认或否认您的 C++ 库的 iostreams 实现是一个瓶颈。

如果甚至 C API 都无法为您提供所需的速度,那么我接下来要看的是将您的文件格式更改为更易于阅读或编写的格式;例如,假设您有足够的内存,可能只使用 mmap() 将一大块虚拟地址空间与文件的内容相关联,然后就好像它是 RAM 一样读/写文件内容。 (这可能会也可能不会使事情变得更快,具体取决于您访问数据的方式)。

如果一切都失败了,最后要做的就是减少需要读取或写入的数据量。是否有部分数据可以单独存储,这样您就不需要每次都读取和写入它们?那里是否有可以更紧凑地存储的数据(例如,您的数据中可能有常用的字符串可以存储为整数代码而不是字符串)?如果在写之前用zlib压缩数据,这样写的数据就少了怎么办?您在示例中似乎正在写入的数据看起来可能适合压缩,可能会将您的 20GB 文件减少到 5GB 左右的文件。等等。

【讨论】:

    猜你喜欢
    • 2017-08-14
    • 1970-01-01
    • 2017-09-07
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2012-05-21
    相关资源
    最近更新 更多