0

サイズが約 10 GB 以上のファイルがあります。このファイルには、各行に 1 から 10 までの数字のみが含まれており、他には何も含まれていません。ここでのタスクは、ファイルからデータ [数値] を読み取り、数値を昇順または降順に並べ替え、並べ替えられた数値で新しいファイルを作成することです。

どなたか、答えを教えていただけませんか?

4

3 に答える 3

1

これはある種の宿題だと思いますが、これの目標は、RAM に保持できるよりも多くのデータをソートすることですか?

数字は 1 ~ 10 しかないので、それほど複雑な作業ではありません。入力ファイルを開いて、特定の数値ごとに何回出現するかを数えるだけです。その後、単純なループを作成して、別のファイルに値を書き込むことができます。次の例は、かなり自明です。

$inFile = '/path/to/input/file';
$outFile = '/path/to/output/file';
$input = fopen($inFile, 'r');
if ($input === false) {
    throw new Exception('Unable to open: ' . $inFile);
}
//$map will be array with size of 10, filled with 0-s
$map = array_fill(1, 10, 0);
//Read file line by line and count how many of each specific number you have
while (!feof($input)) {
    $int = (int) fgets($input);
    $map[$int]++;
}
fclose($input);
$output = fopen($outFile, 'w');
if ($output === false) {
    throw new Exception('Unable to open: ' . $outFile);
}
/*
 * Reverse array if you need to change direction between
 * ascending and descending order
 */
//$map = array_reverse($map);
//Write values into your output file
foreach ($map AS $number => $count) {
    $string = ((string) $number) . PHP_EOL;
    for ($i = 0; $i < $count; $i++) {
        fwrite($output, $string);
    }
}
fclose($output);

巨大なファイルを扱っているという事実を考慮して、PHP環境のスクリプト実行時間制限も確認する必要があります.あなたの質問のパフォーマンス、私はそれがOKだと思います。

于 2013-10-22T11:55:18.727 に答える
0

以前にも同様の問題がありました。このような大きなファイルを操作しようとすると、リソースが大量に消費され、対処できませんでした。私がたどり着いた最も簡単な解決策は、と呼ばれる高速データダンプ機能を使用してMySQLデータベースにインポートしようとすることでしたLOAD DATA INFILE

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

それが入ったら、データを操作できるはずです。

または、ソートされた数値を使用して行ごとに結果を別のファイルに出力しながら、ファイルを行ごとに読み取ることもできます。ただし、これがどれだけうまく機能するかはよくわかりません。

以前にそれを試みたことがありますか、それとも可能な方法を試したばかりですか?

于 2013-10-22T10:40:28.690 に答える
0

PHP が不要な場合 (手元に Linux マシンがある場合):

sort -n file > file_sorted-asc
sort -nr file > file_sorted-desc

編集: OK、これが PHP でのソリューションです (手元に Linux マシンがある場合):

<?php

// Sort ascending
`sort -n file > file_sorted-asc`;

// Sort descending
`sort -nr file > file_sorted-desc`;

?>

:)

于 2013-10-22T10:42:17.317 に答える