我的主应用程序有一个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函数的逐行处理非常慢。我有什么想法可以加快速度吗?我认为主循环中的那些条件不是理想的,所以我在此期间会看到它,但如果有更好的通用方法,那么听到它会很棒。
答案 0 :(得分:1)
我想到了两件事:
seek
转到正确的位置,添加列值,搜索下一行,依此类推。