Эффективное чтение, синтаксический анализ и хранение содержимого .txt файлов в Torch tensors

#optimization #machine-learning #lua #torch

#оптимизация #машинное обучение #lua #torch

Вопрос:

У меня есть огромное количество файлов .txt (возможно, около 10 миллионов), каждый из которых имеет одинаковое количество строк / столбцов. На самом деле это несколько одноканальных изображений, и значения пикселей разделены пробелом. Вот код, который я написал для выполнения этой работы, но он очень медленный. Интересно, может ли кто-нибудь предложить более оптимизированный / эффективный способ сделать это:

 require 'torch'

f = assert(io.open(txtFilePath, 'r'))
local tempTensor = torch.Tensor(1, 64, 64):fill(0)
local i = 1
for line in f:lines() do
    local l = line:split(' ')
    for key, val in ipairs(l) do
        tempTensor[{1, i, key}] = tonumber(val)
    end
    i = i   1
end
f:close()
  

Ответ №1:

Короче говоря, измените исходные файлы, если это возможно.

Единственное, что я могу предложить, — это использовать двоичные данные вместо txt в качестве источника. У вас есть долгосрочные методы: f:lines() , line:split(' ') и tonumber(val) . Все они используют строки в качестве переменных.

Как я понял, у вас есть файл, подобный этому:

0 10 20

11 18 22

….

итак, измените свой исходный код на двоичный следующим образом:

<0><18><20><11><18><22> …

где <18> — байт в шестнадцатеричной форме, то есть 12 , <20> равно 16 и т.д.

читать

 fid = io.open(sup_filename, "rb")
while true do
  local bytes = fid:read(1)
  if bytes == nil then break end -- EOF
  local st = bytes[0]
  print(st)
end

fid:close()
  

https://www.lua.org/pil/21.2.2.html
Это было бы значительно быстрее.

Возможно, использование регулярных выражений (вместо :split() и lines() ) может вам помочь, но я не думаю.

Комментарии:

1. Спасибо, но по некоторым причинам я не могу изменить формат файла на двоичный. На данный момент я должен найти более быстрое решение для чтения исходных файлов.

2. Это невозможно, имо. io это довольно быстро. Может быть, SSD мог бы помочь.