列表上的内存消耗很大.split()

时间:2017-04-26 12:29:39

标签: python

我有一个简单的函数来读取文件并返回一个单词列表:

def _read_words(filename):
  with tf.gfile.GFile(filename, "r") as f:
      words = f.read().replace("\n"," %s " % EOS).split()

  print(" %d Mo" % (sys.getsizeof(words)/(1000*1000)))
  return words

注意:

  • tf.gfile.GFile来自TensorFlow,open也是如此,所以你可以忽略它。
  • EOS是一个包含“<eos>
  • 的字符串

当我使用1.3GB文件运行时,该过程会保留超过 20GB的RAM (请参阅htop屏幕截图),但会为{{1}打印2353 Mo }}

enter image description here

请注意,此过程只不过是:

sys.getsizeof(words)

当我逐步运行时,我会看到以下内容:

  • import reader path = "./train.txt" w = reader._read_words(path) =&gt; 4.039 GB RAM
  • d = file.read() =&gt; 5.4GB RAM
  • d = d.replace('\n', ' <eos> ') =&gt; 22GB RAM

所以我在这里:

  • 我能理解分裂使用额外的内存,但这看起来很荒谬。
  • 我可以使用更好的操作/数据结构吗?使用d = d.split()的解决方案会很棒。
  • 我可以找到针对我的案例的解决方法(见下文),但我仍然不明白为什么我不能以最简单的方式做到这一点。

欢迎提供任何线索或建议,
THX,
保罗

解决方法:
正如我在评论中所解释的那样:

  1. 建立词汇表,即词典numpy
  2. 然后我只选择顶部{"word": count}字,由出现(n为参数)
  3. 为这些单词中的每一个分配一个整数(1到n,0表示句子结尾标记n
  4. 我按句子(<eos>或我们的内部标记\n)加载整个数据
  5. 我们按句子长度排序
  6. 我能做得更好:

    1. 动态计算单词(逐行计算)
    2. 使用此字数构建词汇表(我们不需要整个数据)
    3. 使用词汇表将整个数据作为整数加载,从而节省一些内存。
    4. 对列表进行排序,长度相同,内存消耗量更少。

0 个答案:

没有答案