#python #large-files #python-c-extension
#python #большие файлы #python-c-extension
Вопрос:
Я пытался управлять большими двоичными данными ( 7GB
) в оригинальной библиотеке расширений python x86.
Но fseek
with SEEK_END
работает плохо.
Я поставил _FILE_OFFSET_BITS 64
макрос. Я тоже пытался fseeko64
, но это вызывает ошибку.
С файлами размером менее 2 ГБ или с использованием SEEK_CUR, SEEK_SET это работает нормально.
Я застрял на пару дней. Кто-нибудь может дать мне идеи?
#define _GNU_SOURCE
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64
#include <Python.h>
#include "structmember.h"
#include <stdio.h>
static PyObject *
MyClass_load(MyClass* self, PyObject *args)
{
const char* file_path;
if (!PyArg_ParseTuple(args, "s", amp;file_path))
return NULL;
self->fp = fopen(file_path ,"rb");
if (self->fp == NULL) {
PyErr_SetString(PyExc_IOError, "File does not exist.");
return NULL;
}
off_t offset = 0;
if(fseek(self->fp, offset, SEEK_END) != 0){
printf("%sn", strerror(errno)); // show "Invalid argument"
PyErr_SetString(PyExc_IOError, "Seek failed.");
return NULL;
}
Py_INCREF(Py_None);
return Py_None;
}
Окружающая среда:
- Windows 7 x64
- Python 2.7 x86
- MinGW GCC
Ответ №1:
Использование ‘_fseeki64’ и ‘_ftelli64’, например, VC, работает отлично. Я знаю, что я все еще использую gcc для компиляции файла c в файл библиотеки python c, но я не знаю, почему я могу использовать код VC в gcc. В любом случае, проблема была решена!