gpt4 book ai didi

ruby-on-rails - 如何在 Rails 中读取文件 block 而无需从头开始再次读取

转载 作者:太空宇宙 更新时间:2023-11-03 16:20:40 25 4
gpt4 key购买 nike

我有一个不断增长的文件(日志),我需要按 block 读取。我通过 Ajax 进行调用以获取指定数量的行。我使用 File.foreach 来读取我想要的行,但它总是从头开始读取,我只需要直接返回我想要的行。

示例伪代码:

 #First call:
File.open and return 0 to 10 lines

#Second call:
File.open and return 11 to 20 lines

#Third call:
File.open and return 21 to 30 lines

#And so on...

有没有办法做这个?

最佳答案

方案一:读取整个文件

此处建议的解决方案:
https://stackoverflow.com/a/5052929/1433751

..在您的情况下不是一个有效的解决方案,因为它要求您为每个 AJAX 请求从文件中读取所有行,即使您只需要日志文件的最后 10 行。

这是对时间的极大浪费,在计算方面,求解时间(即以大小为 N 的 block 处理整个日志文件)接近指数求解时间。

解决方案 2:寻求

由于您的 AJAX 调用请求顺序行,我们可以通过使用 IO.seek在阅读前寻找正确的位置,从而实现更高效的方法。和 IO.pos .

这要求您在返回请求行的同时将一些额外数据(最后一个文件位置)返回给 AJAX 客户端。

AJAX 请求然后成为这种形式的函数调用request_lines(position, line_count),它使服务器能够在读取请求之前IO.seek(position)行数。

这是解决方案的伪代码:

客户端代码:

LINE_COUNT = 10
pos = 0

loop {
data = server.request_lines(pos, LINE_COUNT)
display_lines(data.lines)
pos = data.pos
break if pos == -1 # Reached end of file
}

服务器代码:

def request_lines(pos, line_count)
file = File.open('logfile')

# Seek to requested position
file.seek(pos)

# Read the requested count of lines while checking for EOF
lines = count.times.map { file.readline if !file.eof? }.compact

# Mark pos with -1 if we reached EOF during reading
pos = file.eof? ? -1 : file.pos
f.close

# Return data
data = { lines: lines, pos: pos }
end

关于ruby-on-rails - 如何在 Rails 中读取文件 block 而无需从头开始再次读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34040359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com