Python-Builtins.MemoryError:在程序中用于计数大文本文件中的单词

时间:2018-10-09 17:27:59

标签: python count bigdata counter word

这是一个用于计算大文本文件中单词的程序。我正在计算一个单词,并显示20个最常用的单词。

    from timeit import default_timer as timer
    from collections import Counter

    start = timer()

    with  open("word5gb.txt", 'r') as input_file:
        file_contents = ""
        for line in input_file:
            file_contents += line
            word_list = file_contents.split() #create word list
            new_list = sorted(word_list, key=Counter(word_list).get, reverse=True)  #sorting
            new_list = list(dict.fromkeys(new_list)) #eliminates duplicates
            print(new_list[0:20])
            print(new_list[-20:-1])        

    end = timer()

    print('\n', "Time: ", round(end - start, 2), "s (", round(((end - start)/60),2), " min)")

但是当我使用5GB txt文件运行程序时,过一会儿会显示有关错误的信息:

word_list = file_contents.split() #create word list
builtins.MemoryError:

我有8GB,Windows 64位,并且正在使用Python 3.7 64位。

我需要你的帮助。 如何快速,简单地解决此问题?

1 个答案:

答案 0 :(得分:0)

看起来没有必要将所有文件内容都保留在file_contents变量中。

您可以摆脱这一行来节省内存

import 'dart:async';

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {
  MyApp({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String message = "";

  Stream<Notification> stream;

  @override
  void initState() {
    super.initState();
    _showCollectionNotifications(10, true);

    stream.listen((notification) {
      setState(() {
        message = "Notification ${notification.id} received";
      });
    });
  }

  void _showCollectionNotifications(int times, bool isHourly) {
    if (isHourly) {
      stream = Stream.periodic(Duration(seconds: 1), (index) {
        return Notification(index);
      }).take(times);
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: message.isEmpty ? new Container() : Text(message),
        ),
      ),
    );
  }
}

class Notification {
  int id;

  Notification(this.id);
}

,然后使用line变量而不是file_contents逐行处理文件。

如果只需要获取最常用的单词,则可以使用每行的单词更新计数器,最后使用Counter most_common方法获得最常用的单词:

file_contents += line