Проблемы с разбором огромного файла - PullRequest
0 голосов
/ 28 марта 2011

Я анализирую документ и записываю на такие пары дисков, как эти:

0 vs 1, true
0 vs 2, false
0 vs 3, true
1 vs 2, true
1 vs 3, false
..

и т. Д.

Последовательно я балансирую истинные и ложные строки для каждого экземпляра, удаляя случайные строки (строки с истинным значением, если они превышают, и наоборот), и я получаю файл, такой как этот:

0 vs 1 true
0 vs 2 false
1 vs 2 true
1 vs 3 true
1 vs 4 false
1 vs 5 false

Обычно ложные значения намного больше, чем истины, поэтому в предыдущем примере я мог оставить только 1 ложь для 0 и только 2 ложи для примера 1.

Я делаю этот процесс в 2 этапа, перед синтаксическим анализом и последующей балансировкой.

Теперь моя проблема в том, что несбалансированный файл слишком большой: более 1 ГБ, и большая часть его строк будет удалена на этапе балансировки.

У меня вопрос: могу ли я сбалансировать строки при разборе?

Я предполагаю, что нет, потому что я не знаю, какие элементы прибывают, и я не могу удалить ни одну строку до тех пор, пока не будут обнаружены все строки для конкретного экземпляра.

Надеюсь, это понятно. спасибо

Ответы [ 3 ]

0 голосов
/ 28 марта 2011

Пара идей -

1) Если файл имеет размер 1 ГБ, возможно, вы сможете загрузить его в структуру данных, но вы, вероятно, уже пробовали это 2) Если данные отсортированы или сгруппированы по строкам, вы можете читать каждую строку, пока не достигнете новой строки и не произведете ребалансировку 3) Если данные не отсортированы, вы можете отсортировать файл на месте с помощью класса ввода-вывода с произвольным доступом, а затем выполнить 2). 4) Если это невозможно, вы всегда можете сделать несколько проходов по файлу для каждой строки, это, очевидно, будет медленным.

0 голосов
/ 28 марта 2011

Что бы произошло, если бы вы использовали для этого облегченную базу данных - derby, h2 и т. Д.?Я полагаю, что вы можете написать запрос сортировки, фильтрации и т. Д., Чтобы получить то, что вы хотите ...

0 голосов
/ 28 марта 2011

Похоже, вам нужно загружать только данные экземпляра за раз, и вам нужно всего лишь записать число и логическое значение для каждого значения экземпляра.

Я предлагаю вам прочитать данные, пока номер экземпляра не изменится (или не будет достигнут конец файла), который должен быть намного меньше 1 ГБ и зафиксирован в памяти.

Если вы используете TIntArrayList (или int []) и BitSet, это позволит более эффективно хранить данные. Вы можете очистить их после обработки каждого экземпляра.

РЕДАКТИРОВАТЬ: Если данные расположены в случайном порядке, вам может понадобиться прочитать файл один раз, чтобы подсчитать количество истинных / ложных для каждого экземпляра, а затем снова прочитать файл, чтобы получить результат.

Другой вариант - попытаться загрузить весь файл в память другим способом. Вы должны иметь возможность загрузить 1 ГБ данных в этом формате и использовать менее 1 ГБ.

Вам нужно не обращать внимания на то, как вы можете минимизировать накладные расходы, которые вы получаете для каждой строки данных, и вы можете значительно сократить потребление.

class Row { // uses a total of 80 bytes in a 32-bit JVM
    // 16 byte header
    Integer x; // 4 + 24 bytes.
    Integer y; // 4 + 24 bytes.
    Boolean b; // 1 byte
    // 7 bytes of padding.
}

class Row { // uses a total of 32 bytes in a 32-bit JVM
    // 16 byte header
    int x; // 4  bytes.
    int y; // 4 bytes.
    boolean b; // 1 byte
    // 7 bytes of padding.
}

class Rows { // uses a total of 8-9 bytes/row
    // 16 byte header
    int[] x; // 4 bytes/row, TIntArrayList is easier to use.
    int[] y; // 4 bytes/row
    BitSet b; // 1 bit/row
    // 7 bytes of padding.
}

// if your numbers are between -32,768 and 32,767
class Rows { // uses a total of 4-5 bytes/row
    // 16 byte header
    short[] x; // 4 bytes/row, TShortArrayList is easier to use.
    short[] y; // 4 bytes/row
    BitSet b; // 1 bit/row
    // 7 bytes of padding.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...