在Windows 7 x64上使用python x86 C扩展库对大数据(7GB)进行fseek与SEEK_END时返回“无效参数”错误

0 投票
1 回答
1160 浏览
提问于 2025-04-18 10:58

我一直在尝试在Python的x86原生扩展库中处理大文件(二进制数据,大小为7GB)。
但是使用fseek配合SEEK_END时效果不太好。

我加了_FILE_OFFSET_BITS 64这个宏,也试过fseeko64,但出现了错误。
对于小于2GB的文件,或者使用SEEK_CURSEEK_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的代码。无论如何,问题解决了!

撰写回答