Минимизация чтения и письма на диск в Python для тяжелой операции в память

Фон

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

Требования

Ключевым аспектом этой конкретной программы «Я должен написать», является то, что он должен:

  1. прочитал большой корпус (между 5G и 30G, и потенциально более крупные вещи вниз по линии)
  2. . Процесс данных. на каждой строке.
  3. Из этих обработанных данных построить большое количество векторов (размерность некоторых из этих векторов составляет> 4 000 000). Как правило, это здание сотни тысяч таких векторов.
  4. Эти векторы должны быть сохранены на диск в некоторых форматах или другом.

Шаги 1 и 2 не трудно сделать эффективно: просто используйте генераторы и иметь конвейер анализа данных. Большая проблема - это работа 3 (и по подключению 4)

скобки: Технические детали

В случае, если фактическая процедура для строительных векторов влияет на решение:

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

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

Векторы не зависят друг от друга, и не зависит от того, какой порядок прочитан строки корпусов.

Попытка решения

Есть три экстреманта, когда речь идет о том, как это сделать:

  1. Я мог бы Создайте все векторы в памяти. Затем напишите их на диск.
  2. Я мог бы построить все векторы непосредственно на диске, используя шельфу сортирования или какой-то такой библиотеки.
  3. Я мог бы построить векторы в память один за раз и писать его на диск, проходя через корпус один раз в векторе.

Все эти варианты довольно неразрешимы. 1 Просто использует всю системную память, и она панирует и замедляется в ползу. 2 - это слишком медленно, поскольку операции IO не являются быстрыми. 3, возможно, даже медленнее 2 по тем же причинам.

Цели

Хорошее решение будет включать в себя:

  1. строить как можно больше в памяти.
  2. После того, как память заполнена, сбросьте все на диск.
  3. Если снова нужны биты, восстановите их обратно в память, чтобы добавить вещи в эти векторы.
  4. Вернитесь к 1, пока все векторы не будут построены.

Проблема в том, что я не совсем уверен, как поступить об этом. Кажется, что несколько разнозвенно беспокоится о системных атрибутах, таких как RAM, но я не вижу, как эта проблема может быть оптимально решена, не принимая это во внимание. В результате я не знаю, как начать начать эту вещь.

Вопрос

Кто-нибудь знает, как пойти о решении такой проблемы? Я питон просто не правильный язык для такого рода вещи? Или есть ли простое решение, чтобы максимизировать, насколько многое сделано из памяти (в пределах разума), сводясь к минимуму, сколько раз данных необходимо прочитать с диска или записать его?

Большое спасибо за ваше внимание. Я с нетерпением жду, чтобы увидеть, что яркие умы StackOverflow может бросить свой путь.

Дополнительные детали

Вид машины Эта проблема работает, обычно имеет 20+ ядер и ~ 70 г ОЗУ. Проблема может быть распределена (a la MapRuce) в том, что отдельные векторы для одного объекта могут быть созданы из сегментов корпуса, а затем добавлены для получения вектора, который был бы построен из всего корпуса.

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

17
задан vaultah 29 May 2015 в 11:01
поделиться