【问题标题】:Editing a 10gb file using limited main memory in C/C++在 C/C++ 中使用有限的主内存编辑 10gb 文件
【发布时间】:2011-06-18 03:39:09
【问题描述】:

我需要使用 100mb 的内存尽可能快地对包含数字列表的 10gb 文件进行排序。 我将它们分成块然后合并它们。

我目前正在使用 C 文件指针,因为它们比 c++ 文件 i/o(至少在我的系统上)更快。

我尝试了一个 1gb 的文件,我的代码工作正常,但是在打开 10gb 文件后,只要我 fscanf,它就会引发分段错误。

FILE *fin;
FILE *fout;
fin = fopen( filename, "r" );
while( 1 ) {
    // throws the error here
    for( i = 0; i < MAX && ( fscanf( fin, "%d", &temp ) != EOF ); i++ ) {
        v[i] = temp;
    }

我应该改用什么?

您对如何以最好的方式解决这个问题有什么建议吗?

【问题讨论】:

  • vMAX 是什么?也就是说,您是否试图分配一个比实际更大的数组?你写的不是数组末尾吗?
  • v 是我动态分配的数组。 MAX 是一个宏。 v 定义为 int v = new int[MAX];而且 MAX 比可能的要小得多..
  • 您将不得不使用支持“大文件”的 API。您使用的可能取决于您的操作系统,但 C stdio API 不需要支持足够大的偏移类型来处理该大小的文件。这通常是可能的,但您可能需要分享有关您的平台的更多信息才能获得有用的答案。
  • 你检查空指针的分配了吗?同样相关的可能是您的平台(架构+操作系统),例如可能需要设置-D_FILE_OFFSET_BITS=64
  • @Skkard:详情见gnu.org/s/libc/manual/html_node/Feature-Test-Macros.html;将-D_FILE_OFFSET_BITS=64 作为编译器标志传递给 gcc/g++ 将使用具有默认名称的 64 位版本的文件 IO;作为替代方案,在源文件顶部添加#define _LARGEFILE_SOURCE#define _LARGEFILE64_SOURCE 并明确使用64 位版本(例如off64_tfseeko64、...)

标签: c++ c sorting file-io


【解决方案1】:

有一类特殊的算法称为外部排序merge sort 有一个变体,它是一种外部排序算法(merge sort tape 只需要 google)。

但如果您使用的是 Unix,则在单独的进程中运行 sort 命令可能更容易。

顺便说一句。打开大于 2 GB 的文件需要大文件支持。根据您的操作系统和库,您需要定义宏或调用其他文件处理函数。

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多