#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 мог бы помочь.