C#使用NumSharp读取7GB超大.npy文件报算术溢出错误如何解决
C#读取7GB大型.npy文件溢出问题及解决办法
问题场景
我尝试在C#中读取大型.npy文件,使用的是NumSharp Nuget包。目标文件为7GB大小的交错float数组(float[][]),包含约100万条960维的向量。
注意:所用测试数据为Approximate Nearest Neighbors Large datasets的GIST数据。
初始实现及报错
原来的加载代码如下:
private static void ReadNpyVectorsFromFile(string pathPrefix, out List<float[]> candidates) { var npyFilename = @$"{pathPrefix}.npy"; var v = np.load(npyFilename);//NDArray candidates = v .astype(np.float32) .ToJaggedArray<float>() .OfType<float[]>() .Select(a => { return a.OfType<float>().ToArray(); }) .ToList(); }
运行时抛出溢出异常:
Exception thrown: 'System.OverflowException' in NumSharp.dll 未处理的'System.OverflowException'类型异常出现在NumSharp.dll中,提示算术运算导致溢出。
解决办法
问题根因
NumSharp包本身存在大文件读取限制,读取GB级别的npy文件时内部计算数组长度会触发溢出。
推荐替代方案
可以先将原数据转换为.npz格式(可参考numpy的savez()方法实现转换),使用libnpy库完成读取,示例代码如下:
NPZInputStream npz = new NPZInputStream(npyFilename); var keys = npz.Keys(); //var header = npz.Peek(keys[0]); var t = npz.ReadFloat32(keys[0]); Debug.Assert(t.DataType == DataType.FLOAT32);
内容的提问来源于stack exchange,提问作者Samer Aamar
相关产品推荐
相关产品推荐

