如何快速使用 Lua 向文件添加列

我有一个与我们主要应用程序连接的 Lua 脚本接口。

其中一个脚本编写了一个点云文件,该文件是一系列制表符分隔的列,前三列是空间中点的 x、y、z 坐标,后面的列每个列是该点上的特定结果。

我遇到了一种情况,其中有超过两千万个点和大量的结果。当前脚本将所有结果读入内存,逐行写入,并将每个列的结果保存在内存中。对于所描述的情景而言,这对内存来说太重了,因此我已经切换到逐列写入。

我目前是这样做的:首先写入坐标,因为我知道它们可以放入内存,然后逐个获取每个结果向量,并使用以下代码将该向量添加到文件中:

local append_column = function (filename, varname, data)
-- 假定每个列都有相同数量的值
-- 数据是从零开始的!

  if data==nil  then
    do return end
  end
  newfile = assert(io.open("temp.txt", "w"))
  count=0
  for line in io.lines(filename) do
    newfile:write(line)
    if count==0 then
      newfile:write(varname, "\t")
    elseif data[count-1] == nil then
      newfile:write("\t")
    else
      newfile:write(data[count-1], "\t")
    end
    newfile:write("\n")
    count = count + 1
  end
  assert(newfile:close())
  copy_file("temp.txt", filename)
  os.remove("temp.txt")
end

我的 copy_file 函数速度相当快,因为我可以使用

f:read(BUFSIZE, "*line")

以相同大小的块读取输入文件和写入新文件。逐行处理 append_column 函数非常缓慢。你有什么想法可以加快速度吗?我想很久这个主循环内的条件判断并不理想,所以我会在这方面考虑,但如果有更好的一般做法,那将是很好的。

点赞
用户1442917
用户1442917

有两件事需要注意:

  1. 避免多次写入,先构建一个连接的字符串,然后使用一次调用进行写入。
  2. 预先格式化每个文件,为要添加的列提供足够的空间,并仅写入所需的数据,而无需重新编写其余内容。由于您的行是固定长度的,因此可以使用 seek 跳转到正确位置,添加您的列值,然后跳转到下一个位置,以此类推。
2016-05-31 18:11:49