Javascript 从任意行X开始读取很长文件的最快方法

Javascript 从任意行X开始读取很长文件的最快方法,javascript,python,performance,file,io,Javascript,Python,Performance,File,Io,我有一个由python程序写入的文本文件,然后由另一个程序读入并显示在web浏览器上。目前它是由JavaScript读入的,但我可能会将此功能移到python中,并使用ajax请求将结果传递到JavaScript中 该文件不时不定期更新,有时会追加一行,有时多达十行。然后,我需要将文件的更新副本复制到javascript,以便在web浏览器中显示。该文件可能会增长到100000行。新数据始终添加到文件末尾 在当前编写的过程中,javascript每秒检查一次文件的长度,如果文件比上次读入时长,它

我有一个由python程序写入的文本文件,然后由另一个程序读入并显示在web浏览器上。目前它是由JavaScript读入的,但我可能会将此功能移到python中,并使用ajax请求将结果传递到JavaScript中

该文件不时不定期更新,有时会追加一行,有时多达十行。然后,我需要将文件的更新副本复制到javascript,以便在web浏览器中显示。该文件可能会增长到100000行。新数据始终添加到文件末尾

在当前编写的过程中,javascript每秒检查一次文件的长度,如果文件比上次读入时长,它会从头开始重新读入,对于10000多行的文件来说,这很快就会变得很难处理。由于程序有时可能需要每秒钟更新一次文件,所以情况更是如此

用javascript将数据显示到前端的最快/最有效的方法是什么

我想我可以:

  • 记录文件之前的行数,下次仅从该点读取

  • 让一个程序直接将数据传递给另一个程序,而无需读取中间文件(尽管该文件仍必须作为永久日志写入,以便以后访问)

  • 这些方法中的每一种都有具体的好处/问题吗?我如何最好地实现它们

    对于方法#1,我宁愿不要在For循环中执行
    file.next()
    15000次才能到达我要开始读取文件的位置,有更好的方法吗

    对于方法#2,由于我无论如何都需要写入文件,我不读取文件是否节省了大量处理时间

    也许还有其他方法我没有考虑过


    摘要:该程序需要在web浏览器中显示来自python的数据,这些数据不断更新,可能会增长到10万行。因为我每1秒检查一次更新,所以它需要高效,以防它必须连续执行大量更新。

    打开一个大文件并读取最后一部分既简单又快速:打开文件,找到靠近末尾的合适点,从那里读取。但是你需要知道你想读什么。如果您知道要读取和显示多少字节,就可以轻松地执行此操作,因此,在不保持文件打开的情况下,跟踪以前的文件大小会很好地工作

    如果您记录了以前的大小(以字节为单位),请按如下方式读取新内容

    fp = open("logfile.txt", "rb")
    fp.seek(old_size, 0)     
    new_content = fp.read()  # Read everything past the current point
    
    在Python3上,这将读取必须转换为
    str
    字节。如果文件的编码为拉丁文1,则如下所示:

    new_content = str(new_content, encoding="latin1")
    print(new_content)
    
    然后,您应该更新
    old_size
    ,并将该值保存在持久存储中,以备下一轮使用。你没有说你是如何记录上下文的,所以我不会建议一种方法


    如果您可以在服务器进程中持续打开文件,请继续使用@MarcJ链接到的
    tail-f
    方法进行操作。

    打开一个大文件并读取最后一部分既简单又快速:打开文件,找到靠近末尾的合适点,从那里读取。但是你需要知道你想读什么。如果您知道要读取和显示多少字节,就可以轻松地执行此操作,因此,在不保持文件打开的情况下,跟踪以前的文件大小会很好地工作

    如果您记录了以前的大小(以字节为单位),请按如下方式读取新内容

    fp = open("logfile.txt", "rb")
    fp.seek(old_size, 0)     
    new_content = fp.read()  # Read everything past the current point
    
    在Python3上,这将读取必须转换为
    str
    字节。如果文件的编码为拉丁文1,则如下所示:

    new_content = str(new_content, encoding="latin1")
    print(new_content)
    
    然后,您应该更新
    old_size
    ,并将该值保存在持久存储中,以备下一轮使用。你没有说你是如何记录上下文的,所以我不会建议一种方法


    如果您可以在服务器进程中保持文件持续打开,请继续以
    tail-f
    的方式执行,就像@MarcJ链接到的那样。

    您搜索的函数是
    seek

    f.seek(偏移,从什么开始)

    通过向参考点添加偏移来计算位置;参考点由from_what参数选择。A from_值0从文件的开头开始测量,1使用当前文件位置,2使用文件的结尾作为参考点。从_可以省略什么,默认为0,使用文件的开头作为参考点

    Python 3的限制:

    在文本文件(那些在模式字符串中没有a
    b
    打开的文件)中,只允许相对于文件开头进行查找(例外情况是使用seek(0,2)查找文件结尾),并且唯一有效的偏移量值是从f.tell()返回的值,或零。任何其他偏移值都会产生未定义的行为


    请注意,由于行的长度可以是可变的,因此查找特定行是很困难的。相反,记下文件中的当前位置(
    f.tell()
    ),然后返回到该位置。

    您查找的函数是
    seek

    f.seek(偏移,从什么开始)

    通过向参考点添加偏移来计算位置;参考点由from_what参数选择。A from_值0从文件的开头开始测量,1使用当前文件位置,2使用文件的结尾作为参考点。从_可以省略什么,默认为0,使用文件的开头作为参考点

    Python 3的限制:

    在文本文件(那些在模式字符串中没有a
    b
    打开的文件)中,只允许相对于文件开头进行查找(例外情况是使用seek(0,2)查找文件结尾),并且唯一有效的偏移量值是从f.tell()返回的值,或零。任何其他偏移值都会生成und