这是我在 Python 中的代码:
parser = argparse.ArgumentParser()
parser.add_argument('--use_model', type=str, help='model location', required=True)
parser.add_argument('--model_dim', type=int, help='model dimension of words', required=True)
args = parser.parse_args()
f = open(args.use_model, "rb")
f.seek(0)
trained_model = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)
我_pickle.UnpicklingError: could not find MARK在最后一行出错。
在这个问题中:
_pickle.UnpicklingError: 找不到 MARK
它说这f.seek(0)解决了问题,但在我的情况下它没有。
看一下下划线_pickle模块的源代码(用C编写),只有一个地方会出现这样的错误:
static Py_ssize_t
marker(UnpicklerObject *self)
{
Py_ssize_t mark;
if (self->num_marks < 1) {
PickleState *st = _Pickle_GetGlobalState();
PyErr_SetString(st->UnpicklingError, "could not find MARK");
return -1;
}
...
}
Run Code Online (Sandbox Code Playgroud)
在底层,pickle 模块使用标记堆栈来取消pickle 容器对象,并num_marks指示其中有多少个对象。通过Unpickler函数的初始化,num_marks设置为 0,然后当新标记推送到标记堆栈时递增。
出现此错误的可能方法之一是更改 FRAME 操作码(指示帧开始的值)或 MARK 操作码。假设我们使用协议 4(从该版本开始 pickle 具有二进制框架),您可以在pep 3154中阅读更多内容。这个想法简单明了——将所有内容分成块(帧)并标记每个帧的边界。让我们深入探讨一下。
考虑这个例子:
import pickle
data = {"fruits": ["apple", "banana", "pineapple"] }
with open("data.pickle", 'wb') as f:
# Pickle the 'data' dictionary using the highest protocol available.
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
Run Code Online (Sandbox Code Playgroud)
让我们用pickletools来研究一下:
python -m pickletools data.pickle
0: \x80 PROTO 5
2: \x95 FRAME 46
11: } EMPTY_DICT
12: \x94 MEMOIZE (as 0)
13: \x8c SHORT_BINUNICODE 'fruits'
21: \x94 MEMOIZE (as 1)
22: ] EMPTY_LIST
23: \x94 MEMOIZE (as 2)
24: ( MARK
25: \x8c SHORT_BINUNICODE 'apple'
32: \x94 MEMOIZE (as 3)
33: \x8c SHORT_BINUNICODE 'banana'
41: \x94 MEMOIZE (as 4)
42: \x8c SHORT_BINUNICODE 'pineapple'
53: \x94 MEMOIZE (as 5)
54: e APPENDS (MARK at 24)
55: s SETITEM
56: . STOP
the highest protocol among opcodes = 4
Run Code Online (Sandbox Code Playgroud)
这里FRAME(0x95)表示新帧的开始位置,MARK('(')表示容器对象的开始,这些值由协议指定(这是一个实现细节)。
我首先看一下pickle文件的内容,总结一下,问题原因可能是:
f.seek(0),请参阅_pickle.UnpicklingError: Could not find MARK
...又找到原因了吗?请随意编辑答案。
| 归档时间: |
|
| 查看次数: |
2472 次 |
| 最近记录: |