我試圖根據英文wikipedia轉儲中找到的前100K個單詞建立一個n-gram語言模型。我已經使用用Java編寫的修改過的XML解析器提取了純文本,但需要將其轉換爲vocab文件。解決執行Perl腳本時出現內存不足錯誤
爲了做到這一點,我找到了一個據說可以完成這項工作的perl腳本,但是缺少關於如何執行的說明。不用說,我是一個Perl的新手,這是我第一次遇到它的使用需求。
當我運行此腳本時,在使用4GB RAM和runnung Ubuntu 10.04和10.10的兩個獨立雙核心機器上的7.2GB文本文件上使用此腳本時,出現內存不足錯誤。
當我聯繫作者時,他說這個腳本在配備4GB RAM的MacBook Pro上運行良好,並且在使用perl 5.12的6.6GB文本文件上執行時,總內存使用量約爲78 MB。作者還說,該腳本逐行讀取輸入文件,並在內存中創建一個散列表。
的腳本是:
#! /usr/bin/perl
use FindBin;
use lib "$FindBin::Bin";
use strict;
require 'english-utils.pl';
## Create a list of words and their frequencies from an input corpus document
## (format: plain text, words separated by spaces, no sentence separators)
## TODO should words with hyphens be expanded? (e.g. three-dimensional)
my %dict;
my $min_len = 3;
my $min_freq = 1;
while (<>) {
chomp($_);
my @words = split(" ", $_);
foreach my $word (@words) {
# Check validity against regexp and acceptable use of apostrophe
if ((length($word) >= $min_len) && ($word =~ /^[A-Z][A-Z\'-]+$/)
&& (index($word,"'") < 0 || allow_apostrophe($word))) {
$dict{$word}++;
}
}
}
# Output words which occur with the $min_freq or more often
foreach my $dictword (keys %dict) {
if ($dict{$dictword} >= $min_freq) {
print $dictword . "\t" . $dict{$dictword} . "\n";
}
}
我通過mkvocab.pl corpus.txt
正在執行的命令行這個腳本中包括額外的腳本是一個簡單的正則表達式腳本來測試撇號的的位置,以及它們是否匹配英語語法規則。
我以爲內存泄漏是由於不同的版本,因爲我的機器上安裝了5.10。所以我升級到5.14,但錯誤仍然存在。根據free -m
,我的系統上有大約1.5GB的可用內存。
由於我完全不熟悉語言的語法和結構,能否指出問題的原因以及問題存在的原因以及如何解決問題。
你的輸入文件中是否有長行?如果你的輸入文件沒有換行符,你將在內存中保存大量數據。即使假設你的文字有重複,你的散列值可能會非常大。 – TLP