当前位置: 首页 > 面试题库 >

加快写入文件

越勇
2023-03-14
问题内容

我已经介绍了一些我使用cProfile继承的旧代码。我已经进行了很多更改,这些更改有所帮助(例如使用simplejson的C扩展!)。

基本上,此脚本将数据从一个系统导出到ASCII固定宽度文件。每行都是一条记录,并且具有许多值。每行是7158个字符,并包含大量空格。总记录数为150万条记录。每行一次生成一次,并需要一段时间(每秒5-10行)。

生成每一行时,将尽可能简单地将其写入磁盘。分析表明,约
19-20%的时间用于file.write()。对于1,500行的测试用例,即20秒。我想减少这个数字。

现在看来,下一个胜利将是减少写入磁盘的时间。如果可能的话,我想减少它。我可以在内存中保留记录缓存,但是我不能等到最后将其全部转储。

fd = open(data_file, 'w')
for c, (recordid, values) in enumerate(generatevalues()):
        row = prep_row(recordid, values)
        fd.write(row)
        if c % 117 == 0:
                if limit > 0 and c >= limit:
                        break
                sys.stdout.write('\r%s @ %s' % (str(c + 1).rjust(7), datetime.now()))
                sys.stdout.flush()

我的第一个想法是将记录的缓存保留在列表中,然后分批写出。这样会更快吗?就像是:

rows = []
for c, (recordid, values) in enumerate(generatevalues()):
        rows.append(prep_row(recordid, values))
        if c % 117 == 0:
            fd.write('\n'.join(rows))
            rows = []

我的第二个想法是使用另一个线程,但这使我想死在里面。


问题答案:

分批写入500个组确实确实大大提高了写入速度。对于此测试用例,写入行分别在I /
O中花费21.051秒,而分批写入117则花费5.685秒来写入相同数量的行。批次500仅花费了0.266秒。



 类似资料:
  • 问题内容: 我做了一个方法,需要一个和一个。它用该字符串作为内容的新文件替换该文件。 这就是我所做的: 但是,它非常缓慢。有时需要一分钟以上。 如何写出包含成千上万个字符的大文件? 问题答案: 确保分配了足够大的缓冲区: 您正在运行哪种操作系统?那也可以有很大的不同。但是,花一 分钟 时间写出一个小于大小的文件听起来像是系统问题。在Linux或其他* ix系统上,您可以使用类似的方法来查看JVM是

  • 问题内容: 快速将NSDictionaries写入文件有局限性。根据我从api文档中学到的知识和这个答案,键类型应该是NSString,值类型也应该是NSx类型,并且Int,String和其他swift类型可能不起作用。问题是,如果我有一个像这样的字典:如何快速将其写入plist文件或从plist文件读取? 问题答案: 无论如何,当您要存储到文件时,它必须是协议的子类并符合协议。像这样: 然后,这

  • 问题内容: 我有一个网站,每次用户登录或注销时,我都会将其保存到文本文件中。 如果不存在附加数据或创建文本文件,我的代码将不起作用。这是示例代码 再次打开它后,它似乎没有追加到下一行。 另外,我认为在两个用户同时登录的情况下也会出现错误,会影响打开文本文件并随后保存吗? 问题答案: 尝试这样的事情:

  • 问题内容: 如何将一小段文字写入文件?我已经使用Google搜索了3-4多个小时,但无法找到具体方法。 有很多论据,我不知道该如何使用。 当您只想在文件中写一个名字和几个数字时,最容易使用的功能是什么? 编辑:添加了一段我的代码。 问题答案:

  • Go将数据写入文件的方法和上面介绍过的读取文件的方法很类似。 package main import ( "bufio" "fmt" "io/ioutil" "os" ) func check(e error) { if e != nil { panic(e) } } func main() { // 首先看一下如何将一个字符

  • 通过FileEntry的createWriter方法可以获取FileWriter对象,通过FileWriter可以对文件进行写操作: fileEntry.createWriter(function(fileWriter) { //We'll do something with fileWriter later }, errorHandler); 对于FileEntry,可以通过Entry