2015-04-04 7 views
0

Я не могу открыть этот конкретный файл (получил его от here, он находится внутри gist.tar.gz), однако я могу открыть файл запроса, например, и прочитать его правильно. Что не так? Может быть, проблема заключается в том, что файл слишком большой для меня? Но я подумал, что если бы это было так, я мог бы открыть его, а затем получить bad_alloc или что-то в этом роде.Невозможно открыть существующий двоичный файл

Вот что происходит:

[email protected]:~/parallel/rkd_forest/code$ ./rkd_sam 
I/O error : Unable to open the file ../Datasets/gist/gist_base.fvecs 
[email protected]:~/parallel/rkd_forest/code$ cd ../Datasets/gist/ 
[email protected]:~/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); 

Вот разрешения файла: enter image description here

и его размер составляет 3,8 ГБ (3,844,000,000 байт), а I знает, что этот набор данных too big for this computer.

В результате я moved на другой компьютер, но у меня такая же проблема.

Память есть (это 64 бита, в то время как мой компьютер работает на 32 бит):

[email protected]:~/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|

и значение берется из ЦМД и в коде я это делаю:

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

Использование, например. ['strerror'] (http://en.cppreference.com/w/cpp/string/byte/strerror), чтобы узнать фактическую ошибку. –

+1

напечатайте код ошибки (errno) или используйте функцию C для поиска текста ошибки. Открытие файла не сработает просто потому, что файл слишком велик. Что-то еще не так. –

+0

@JoachimPileborg отредактирован. Интересно, какой джим! – gsamaras

ответ

2

Ошибка вы получаете EOVERFLOW, который вы читаете the open manual page означает

pathname ссылается на обычный файл, который слишком велик, чтобы быть открыт. Обычный сценарий здесь заключается в том, что приложение , составленное на 32-битной платформе без -D_FILE_OFFSET_BITS=64 попытался открыть файл, размер которого превышает (1 < < 31) -1 байты; см. также O_LARGEFILE выше. Это ошибка, указанная POSIX.1-2001; в ядрах до 2.6.24, Linux дал ошибку EFBIG для этого случая.

Что означает, что вы находитесь на 32-битной платформе и попробуйте открыть файл, который просто большой, чтобы обращаться без особых соображений.

Либо перекомпилируйте свою программу с помощью -D_FILE_OFFSET_BITS=64, либо используйте звонок open непосредственно с флагом O_LARGEFILE.

+0

Это сработало, но, к сожалению, я не мог удовлетворить меня. http://stackoverflow.com/questions/29447736/same-memory-limitation-to-a-bigger-machine – gsamaras

0

кажется, что программа пытается открыть файл в текущем каталоге (code), в то время как файл находится в другом (Datasets/gist'). You did not provide the value of the filename` переменных, но она должна содержать полный путь к файлу для правильной работы.

Вы можете попробовать

cd ../Datasets/gist/ 
../../code/rkd_sam 

Это должно работать, если filename содержит только базовое имя без какого-либо пути.

имеют размер файла не имеет значения, насколько fopen().

+0

Пробовал, такой же результат. – gsamaras

+0

Просьба указать код, задающий имя файла, и напечатать значение этой переменной до 'fopen()'. –

+0

Отредактированный Майк, см. Мое сообщение. – gsamaras