2014-10-26 2 views
6

файл содержит 2000000 строк: каждая строка содержит 208 столбцов, разделенных запятой, например:Почему numpy narray читает из файла, потребляет столько памяти?

0.0863314058048,0.0208767447842,0.03358010485,0.0,1.0,0.0,0.314285714286,0.336293217457,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0

Программа считывает этот файл на Numpy narray, я ожидал, что он будет потреблять около (2000000 * 208 * 8B) = 3.2GB памяти. Однако, когда программа читала этот файл, я обнаружил, что программа потребляет около 20 ГБ памяти.

Я смущен тем, почему моя программа потребляет столько памяти, что не соответствует ожиданиям?

+0

Можете ли вы показать точную строку кода, которая считывает данные из файла? Трудно ответить, если мы должны угадать. –

+0

@BasSwinckels спасибо, я использую np.loadtxt() для чтения данных. Саулло Кастро указал на проблему и объяснил эту проблему примерно. –

ответ

2

Я использую Numpy 1.9.0 и inneficiency памяти np.loadtxt() и np.genfromtxt(), кажется, напрямую связано с тем, что они основаны на временные списки для хранения данных:

  • см here для np.loadtxt()
  • и here для np.genfromtxt()

Зная заранее shape вашего массива, вы можете придумать устройство чтения файлов, которое будет потреблять объем памяти, очень близкий к теоретическому объему памяти (3,2 ГБ для этого случая), путем хранения данных с использованием соответствующих dtype:

def read_large_txt(path, delimiter=None, dtype=None): 
    with open(path) as f: 
     nrows = sum(1 for line in f) 
     f.seek(0) 
     ncols = len(f.next().split(delimiter)) 
     out = np.empty((nrows, ncols), dtype=dtype) 
     f.seek(0) 
     for i, line in enumerate(f): 
      out[i] = line.split(delimiter) 
    return out 
+0

, увидев образец строки, может быть огромная память, когда некоторая разреженная матрица скорее будет использоваться, не так ли? – user3666197

+0

@ user3666197 Конечно, да, но для этого потребуется более сложная функция чтения .... –

+0

уверен, что проблема с OP, по-видимому, связана с памятью, поэтому это было направлением для компромиссов, потенциально блокирующих проблему с привязкой к памяти для связанных с ЦП усилия, которые делают как входной, так и дальнейшую обработку возможной даже на более больших наборах данных (мой смысл подсказки говорит, что OP не ищет однострочный или несколько SLOC-ов, но приемлемый подход для ввода и обработки аналогичных партий данных с бесчисленным комфортом, так что заплатит стоимость чуть более умного ввода-препроцессора) – user3666197

0

Я думаю, вы должны попробовать pandas для обработки больших данных (текстовых файлов). pandas похож на excel на python. И он внутренне использует numpy для представления данных.

Файлы HDF5 также являются еще одним способом сохранения больших данных в двоичном файле hdf5.

Этот вопрос будет дать некоторое представление о том, как обрабатывать большие файлы - "Large data" work flows using pandas

+0

Я не пользовался пандами, спасибо за ваш совет, я узнаю его. –

Смежные вопросы