如何远程修改大文件

时间:2014-08-09 07:59:09

标签: python

我有一个大型XML文件,大约30 MB。

每隔一段时间我就需要更新一些值。我正在使用element tree模块来修改XML。我目前正在获取整个文件,更新它然后重新放置它。所以每次都有大约60 MB的数据传输。有没有办法远程更新文件? 我使用以下代码更新文件。

import xml.etree.ElementTree as ET

tree = ET.parse("feed.xml")
root = tree.getroot()

skus = ["RUSSE20924","PSJAI22443"]
qtys = [2,3]

for child in root:
    sku = child.find("Product_Code").text.encode("utf-8")
    if sku in skus:
        print "found"
        i = skus.index(sku)
        child.find("Quantity").text = str(qtys[i])
        child.set('updated', 'yes')

tree.write("feed.xml")

1 个答案:

答案 0 :(得分:6)

除非附加到文件中,否则无法直接通过FTP修改文件而不上传整个文件。

原因是FTP中只有三个实际修改文件的命令(Source):

  • APPE:附加到文件
  • STOR:上传文件
  • STOU:在服务器上使用唯一名称
  • 创建新文件

你能做什么

跟踪更改

在本地缓存远程文件,并使用MDTM命令跟踪对文件的更改。

优点:

  • 在许多情况下,所需数据传输的一半。
  • 几乎不需要对现有代码进行任何更改。
  • 几乎零开销。

缺点:

  • 其他客户必须在每次更改时下载整个内容(从当前情况无变化)

分成几个文件

将XML拆分为多个文件。 (每个产品代码一个?)
这样您只需下载实际需要的数据。

优点:

  • 转移的数据较少
  • 允许访问数据的所有脚本仅下载所需内容
  • 可与建议#1
  • 结合使用

缺点:

  • 所有现有代码必须改编
  • 下载或更新所有数据时的额外开销

切换到增量同步协议

如果存储服务器支持它,切换到像rsync这样的增量同步协议会有很大帮助,因为它们只会传输更改(只需很少的开销)。

优点:

  • 减少数据传输
  • 只需对现有代码进行少许更改

缺点:

  • 可能无法使用

远程执行

你已经指出你不能但它仍然是最好的解决方案。

什么无济于事

切换到网络文件系统

正如评论中的某些人已经指出,切换到网络文件系统(如NFS或CIFS / SMB)不会真正有用,因为你cannot actually change parts of the file unless the new data has the exact same length

怎么做

除非你可以进行增量同步,否则我建议首先在客户端实现一些缓存,如果它没有足够的帮助那么就分割你的文件。