这是一个用于计算大文本文件中单词的程序。我正在计算一个单词,并显示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位。
我需要你的帮助。 如何快速,简单地解决此问题?
答案 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