我无法打开该特定文件(从here获取,它位于gist.tar.gz内),但我可以打开查询文件并正确阅读。怎么了?也许问题在于文件对我来说太大了?但我认为,如果是这种情况,我可以打开它,然后收到bad_alloc
或其他东西。
以下是发生的事情:
samaras@samaras-A15:~/parallel/rkd_forest/code$ ./rkd_sam
I/O error : Unable to open the file ../Datasets/gist/gist_base.fvecs
samaras@samaras-A15:~/parallel/rkd_forest/code$ cd ../Datasets/gist/
samaras@samaras-A15:~/parallel/rkd_forest/Datasets/gist$ ls
gist_base.fvecs gist_groundtruth.ivecs gist_learn.fvecs gist_query.fvecs
这是我的代码(应该没问题):
FILE* fid;
fid = fopen(filename, "rb");
if (!fid)
printf("I/O error : Unable to open the file %s\n", filename);
以下是文件的权限:
,其大小为3.8 GB(3,844,000,000字节),我知道该数据集为too big for this computer。
结果我moved到另一台机器,但我遇到了同样的问题。
那里的内存(它是64位,而我的电脑运行32位):
gsamaras@geomcomp:~/Desktop/code$ free -mt
total used free shared buffers cached
Mem: 3949 3842 106 0 173 3186
-/+ buffers/cache: 483 3466
Swap: 10867 59 10808
Total: 14816 3901 10914
std::cerr << "Error: " << strerror(errno) << std::endl;
,得到
Error: Value too large for defined data type
printf("|%s|\n", filename);
,得到
|../Datasets/gist/gist_base.fvecs|
,值取自cmd,在我正在执行此操作的代码中:
readDivisionSpacefvecs<FT>(test, N, D, argv[8]); // in main()
然后
void readDivisionSpacefvecs(Division_Euclidean_space<T>& ds, int& N, int& D, char* filename) {
FILE* fid;
fid = fopen(filename, "rb");
printf("|%s|\n", filename);
if (!fid) {
printf("I/O error : Unable to open the file %s\n", filename);
std::cerr << "Error: " << strerror(errno) << std::endl;
}
...
}
我还尝试移动包含数据集的文件夹,但结果相同!
答案 0 :(得分:2)
您收到的错误是EOVERFLOW
,您读到the open
manual page表示
pathname
指的是一个太大的常规文件 打开。这里通常的情况是应用程序 在没有-D_FILE_OFFSET_BITS=64
的32位平台上编译 试图打开一个大小超过(1 <&lt;&lt; 31)-1字节的文件;看到 也是O_LARGEFILE
以上。这是指定的错误 POSIX.1-2001;在2.6.24之前的内核中,Linux给出了错误 对于这种情况EFBIG
。
这意味着您在32位平台上尝试打开一个简单易用的文件,无需特殊考虑。
使用-D_FILE_OFFSET_BITS=64
重新编译您的程序,或使用open
标记直接使用O_LARGEFILE
调用。
答案 1 :(得分:0)
程序似乎试图在当前目录(code
)中打开该文件,而该文件位于另一个(Datasets/gist'). You did not provide the value of the
filename`变量中,但它应包含完整路径正确工作的文件。
你可以尝试
cd ../Datasets/gist/
../../code/rkd_sam
如果filename
仅包含没有任何路径的基本名称,则此方法应该有效。
就fopen()
而言,文件的大小根本不重要。