在Windows 7 x64上使用python x86 C扩展库对大数据(7GB)进行fseek与SEEK_END时返回“无效参数”错误
我一直在尝试在Python的x86原生扩展库中处理大文件(二进制数据,大小为7GB
)。
但是使用fseek
配合SEEK_END
时效果不太好。
我加了_FILE_OFFSET_BITS 64
这个宏,也试过fseeko64
,但出现了错误。
对于小于2GB的文件,或者使用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", &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("%s\n", 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 个回答
1
使用'_fseeki64'和'_ftelli64'就像在VC中一样,效果很好。我知道我还是在用gcc把C文件编译成Python的C库文件,但我不明白为什么我可以在gcc中使用VC的代码。无论如何,问题解决了!