如何使用lua快速将列添加到文件中

时间:2016-05-31 15:48:01

标签: file lua

我的主应用程序有一个lua脚本接口。

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

我有一个案例,其中有超过2000万点和大量结果。当前脚本将所有结果读入内存并一次写入每行,并为内存中的每列提供结果。对于所描述的情况,这对于内存来说太沉重了,所以我已经开始逐列地编写它。

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

local append_column = function (filename, varname, data) 
-- assumes every column has the same number of values    
-- data is zero indexed! 

  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函数的逐行处理非常慢。我有什么想法可以加快速度吗?我认为主循环中的那些条件不是理想的,所以我在此期间会看到它,但如果有更好的通用方法,那么听到它会很棒。

1 个答案:

答案 0 :(得分:1)

我想到了两件事:

  1. 首先避免多次写入并构建连接字符串,然后通过一次调用编写它。
  2. 预先格式化每个文件,以便为要添加的列留出足够的空间,只需编写所需的数据,而无需重写其余内容。由于您的行是固定长度的,因此您可以使用seek转到正确的位置,添加列值,搜索下一行,依此类推。