2015-02-17 2 views
2

Я должен написать System.Array (1e09 элементов из типа Single) в двоичный файл. Я мог бы, конечно, перебрать Array с .GetValue() и упаковать каждый сингл в 4-байтовой структуре, но это очень медленно.Как эффективно писать System.Array в двоичный файл в IronPython?

Можно ли использовать стандартный файл ввода/вывода Python в этом случае? Я пробовал somefile_write(some_systemarray), но в результате появляется сообщение об ошибке.

Меня интересуют только массивы 1D, однако ответ, который работает для массивов nD, будет высоко оценен.

Редактировать После прочтения первого комментария, я попытался следующий код:

from System import * 
    from System.IO import * 

    arr = Array.CreateInstance(Single, 1e8) 
    b = BinaryWriter(File.Open('test.bin', FileMode.Create)) 
    for i in arr : 
     b.Write(i) 
    b.Close() 

К сожалению, это занимает ок. 45 сек. Имеется BinaryWriter.Write(Byte[]). Тем не менее, это только ускорит работу, когда можно быстро преобразовать System.Array в Byte[].

+0

Я подозреваю, что [BinaryWriter] (https://msdn.microsoft.com/en-us/library/system.io.binarywriter%28v=vs.110%29.aspx), непосредственно записи потока или посмотреть на [BinaryFormatter] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binary.binaryformatter (VS.71) .aspx) может помочь. Кажется маловероятным, что операция «native python» на IronPython будет быстрее, чем что-либо, что может предложить .NET. Что будет с данными на другом конце? –

+0

Я посмотрю на это. Я хотел бы прочитать данные из файла в моем коде на C++. –

ответ

0

Вы пытались создать массив байтов вместо массива Single?

from System import * 
from System.IO import * 

arr = Array.CreateInstance(Byte, 1e8) 
b = BinaryWriter(File.Open('test.bin', FileMode.Create)) 
b.Write(arr) 
b.Close() 
+0

К сожалению, тип - это массив Single. Поскольку я читаю данные из внешнего API, я не могу это изменить. –

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