在Lua中读取大型JSON文件

时间:2016-02-28 05:39:50

标签: json lua torch

我正在尝试读取JSON文件中的一些数据,以便从lua中使用它。这些数据是已在python中预处理并存储在JSON中以便于访问的声音文件。

该文件大约为800Mb。当我尝试使用file:read("*all")阅读整个文件时,我收到not enough memory响应。我查看过的图书馆是lua-jsonlua-cjsonluajson。前两个不提供直接访问文件的方法,第三个方法不提供,但只是一个调用f:read()的包装器。

我的最终目标是使用torch在一些音频数据上训练一些模型,但我想在python中继续处理原始信号。为方便起见,我选择了JSON优于其他格式,所以如果你认为有一种更好的格式,我愿意接受。

3 个答案:

答案 0 :(得分:0)

我不确定json是存储音频数据的最佳格式,但在这种情况下,您似乎需要编写自己的json解析器来读取文件,解析数据,以及将它们传递给您的训练过程,而不将整个数据集存储在内存中。

由于json格式非常简单,并且您可以将处理限制为仅处理格式,因此编写类似SAX的解析器应该相对简单,它将生成您需要的事件。 This SO answer可能是一个很好的起点(或者至少可以为您提供搜索关键字的建议)。

答案 1 :(得分:0)

您有两种选择:

选项1:使用Lua52而不是LuaJIT安装火炬。没有任何改变,一切都按预期工作,你现在可以加载你的json文件并解码它没有内存问题。要做到这一点:

var fs = Npm.require('fs')
var xsd = fs.readFileSync(process.cwd().split('.meteor')[0] + 'server/company.xsd', 'utf8')

选项2: 使用HDF5保存python预处理文件,并使用torch-hdf5加载它们。无论如何,HDF5比JSON更适合您的数据。

答案 2 :(得分:0)

您可以尝试npy4th而不是使用json,并且可以将数据保存为" npz"文件。

另一种选择是使用lutorpy,一个允许你在python中运行lua / torch的库,并提供方便的实用程序,用于在numpy数组和torch张量之间进行转换,优点是不需要内存复制或磁盘复制,它们共享底层记忆,所以它非常快。查看the website了解详情。

一个基本的例子:

import lutorpy as lua
import numpy as np

## use require("MODULE") to import lua modules
require("nn")

## run lua code in python with minimal modification:  replace ":" to "._"
t = torch.DoubleTensor(10,3)
print(t._size()) # the corresponding lua version is t:size()

## or, you can use numpy array
xn = np.random.randn(100)
## convert the numpy array into torch tensor
xt = torch.fromNumpyArray(xn)

## convert torch tensor to numpy array
### Note: the underlying object are sharing the same memory, so the conversion is instant
arr = xt.asNumpyArray()
print(arr.shape)