2015-03-05 3 views
0

По какой-то причине я разбил свой код на 2 части; первая часть написана на C и вторая часть с python. Я написал вывод кода C в файле и использовал его в python в качестве моего ввода, теперь моя проблема в том, когда я хочу загрузить файл в массив numpy, занимает около 18 минут, что очень много, и мне нужно уменьшить это время. размер fie составляет около 300 МБ.numpy loadtxt занимает так много времени

код C для записи в файл, как:

struct point { 
    float fpr; 
    float tpr; 
    point(float x, float y) 
    { 
     fpr = x; 
     tpr = y; 
    } 
}; 
vector<point> current_points; 
// filling current_points ...... 
ofstream files; 
files.open ("./allpoints.txt") 
for(unsigned int i=0; i<current_points.size(); i++) 
      files << current_points[i].fpr << '\t' << current_points[i].tpr << "\n"; 

и чтение файла в Python, как:

with open("./allpoints.txt") as f: 
    just_comb = numpy.loadtxt(f) #The problem is here (took 18 minutes) 

allpoints.txt, как это (как вы можете видеть, это координация некоторых точек в 2D-измерении):

0.989703 1 
0 0 
0.0102975 0 
0.0102975 0 
1 1 
0.989703 1 
1 1 
0 0 
0.0102975 0 
0.989703 1 
0.979405 1 
0 0 
0.020595 0 
0.020595 0 
1 1 
0.979405 1 
1 1 
0 0 
0.020595 0 
0.979405 1 
0.969108 1 
... 
... 
... 
0 0 
0.0308924 0 
0.0308924 0 
1 1 
0.969108 1 
1 1 
0 0 
0.0308924 0 
0.969108 1 
0.95881 1 
0 0 

Теперь, мой вопрос в том, является ли это re лучший способ сохранить вектор точек в файле (что-то вроде двоичного формата) и быстрее прочитать его в python в 2D-массив numpy?

+2

У Pandas есть более быстрый загрузчик 'csv'. – hpaulj

+0

http://stackoverflow.com/questions/15096269/the-fastest-way-to-read-input-in-python/15097561#15097561 –

ответ

1

Вы попробовали numpy.fromfile?

>>> import numpy 
>>> data = numpy.fromfile('./allpoints.txt', dtype=float, count=-1, sep=' ') 
>>> data = numpy.reshape(data, (len(data)/2, 2)) 
>>> print(data[0:10]) 
[[ 0.989703 1.  ] 
[ 0.   0.  ] 
[ 0.0102975 0.  ] 
[ 0.0102975 0.  ] 
[ 1.   1.  ] 
[ 0.989703 1.  ] 
[ 1.   1.  ] 
[ 0.   0.  ] 
[ 0.0102975 0.  ] 
[ 0.989703 1.  ]] 

Для меня потребовалось 20 секунд с входным файлом 300M.

+0

На самом деле прямо сейчас я работаю с numpy.fromfile; но мне потребовалось 2 минуты, у вас есть какое-то другое предложение улучшить файл для чтения, так как мне нужно запустить этот код через тысячи разных файлов, и я хочу получить результат за секунду! – Am1rr3zA

+0

В принципе, напишите данные как двоичные. В качестве быстрого теста я написал данные как .npy-файл (который был на 50% больше, к моему удивлению), и я получил менее 1 секунды времени на чтение. Вы можете попытаться заставить C выписать двоичный файл, который из файла может читать или использовать эту библиотеку https://github.com/rogersce/cnpy или следовать этому формату https://github.com/numpy/numpy/blob/master/ doc/neps/npy-format.rst или использовать HDF5, как предлагает Джон. Или напишите свой интерфейс в python, а затем вы можете использовать 'numpy.save' –

3

Если вы хотите использовать предварительно обработанное библиотечное решение, используйте HDF5. Если вы хотите что-то более минималистичные без зависимостей, это сделать:

files.write(reinterpret_cast<char*>(current_points.data()), 
    current_points.size() * sizeof(point)); 

Это даст вам простой 2D массив поплавков, написанные непосредственно в файл. Затем вы можете прочитать этот файл с помощью [numpy.fromfile()][1].

+0

Я использую HDF5 в своем коде на Python, но вопрос в том, как я могу написать свой вывод в него в C. – Am1rr3zA

+0

http://www.hdfgroup.org/HDF5/examples/api18-c.html - API C для HDF5 не очень проста в использовании, но это также невозможно. –

+0

Я попытался [numpy.fromfile()] [1], но это дало мне ошибку, так как я думаю, что для этого нужен файловый дескриптор. Я изменил его на [numpy.fromfile()] [1], но у меня проблема с индексом вне диапазона Я изменил его на np.fromfile (f), но он считывает в массив 1D numpy и значения неверны. Есть идеи? – Am1rr3zA

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