2016-02-28 3 views
2

Я пытаюсь прочитать некоторые данные в файле JSON, чтобы использовать его из lua. Данные представляют собой звуковые файлы, которые были предварительно обработаны на питоне и сохранены в JSON для облегчения доступа.Прочитать большой файл JSON в Lua

Файл примерно 800Mb. Когда я пытаюсь прочитать прочитанный весь файл с file:read("*all"), я возвращаю ответ not enough memory. Библиотеки, на которые я смотрел, - lua-json, lua-cjson и luajson. Первые два не предоставляют способ прямого доступа к файлам, третий - только оболочку, которая вызывает f:read().

Моя конечная цель - использовать torch для обучения некоторых моделей некоторым аудиоданным, но я хочу сохранить обработку необработанных сигналов в python. Я выбрал JSON над другими форматами для удобства, поэтому, если вы считаете, что есть формат, который будет работать лучше, я открыт для идей.

ответ

0

Я не уверен, что json - лучший формат для хранения аудиоданных, но, похоже, в этой ситуации вам нужно написать собственный JSON-синтаксический анализатор, который будет читать файл, анализировать данные и передавать их через ваш учебный процесс, не сохраняя весь набор данных в памяти.

Поскольку формат json довольно прост, и вы можете ограничить обработку только обработкой своего формата, должно быть относительно просто написать SAX-подобный парсер, который будет генерировать события, которые вам нужны. This SO answer может быть хорошей отправной точкой (или, по крайней мере, дать вам представление о том, какие ключевые слова искать).

+0

Почему не удается сохранить все данные в памяти? Я имею в виду, это всего лишь 1 ГБ; Вы действительно правы, когда говорите, что JSON - не лучший формат. Я думаю о том, чтобы двигаться в направлении [capnp] (https://capnproto.org/) или [protobuf] (https://developers.google.com/protocol-buffers/). –

+0

факел использует LuaJIT, который может использовать только 1Gb для значений Lua. Существует привязка к библиотеке yajl. Никогда не пробуйте это самостоятельно. – moteus

0

У вас есть два варианта:

Вариант 1: Установить факел с Lua52 вместо LuaJIT. Ничего не меняется, все работает так, как ожидалось, и теперь вы можете загрузить свой json-файл и декодировать его без проблем с памятью. Для этого:

cd ~/torch 
./clean.sh 
TORCH_LUA_VERSION=LUA52 ./install.sh 

Вариант 2: Используйте hdf5, чтобы сохранить ваш питон предварительно обработанных файлов, и использовать факел-hdf5, чтобы загрузить их. HDF5 гораздо более подходит для ваших данных, чем JSON в любом случае.

+0

Знаете ли вы, что производительность факела ухудшится, переключившись на lua52? –

+0

отсутствие деградации. Весь тяжелый и безупречный код в C/C++ – smhx

0

Вместо использования json вы также можете попробовать npy4th, и вы можете сохранить данные как файл "npz".

Другой вариант - использовать lutorpy, библиотеку, которая позволяет запускать lua/torch в python и предоставлять удобные утилиты для преобразования между массивом numpy и тензором факела, преимущество в том, что копия памяти или копия диска не нужны, они совместно используют основная память, так что это очень быстро. Для получения дополнительной информации проверьте 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) 
Смежные вопросы