我正在尝试在 CSharp 中读取一个大的 .npy 文件。为了做到这一点,我正在尝试使用NumSharp nuget。
该文件是 7GB 锯齿状浮点数组 (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();
}
例外是:
引发异常:NumSharp.dll 中的“System.OverflowException” NumSharp.dll 中发生“System.OverflowException”类型的未处理异常算术运算导致溢出。
我该如何解决这个问题?
更新
如果文件太大,NumSharp 包有限制。阅读下面的评论/答案以获得更多解释。我添加了一个带有解决方法建议的答案
但是,一个好的选择是将数据保存为 .npz(请参阅:numpy.savez()),然后以下包可以完成这项工作:
https://github.com/matajoh/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);