【发布时间】: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;
}
我应该改用什么?
您对如何以最好的方式解决这个问题有什么建议吗?
【问题讨论】:
-
v和MAX是什么?也就是说,您是否试图分配一个比实际更大的数组?你写的不是数组末尾吗? -
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_t、fseeko64、...)