Уменьшение производительности, пишущий большой двоичный файл

В одном из нашего программного обеспечения мы создаем записи и храним их в двоичном файле. После того как операция записи завершается, мы читаем назад этот двоичный файл. Проблема - то, если этот двоичный файл составляет меньше чем 100 МБ затем, его производительность достаточно хороша, но после того как этот файл растет, его производительность поражена.

Так, я думал о разделении этого большого двоичного файла (> 100 МБ) в меньшие (<100 МБ). Но кажется, что это решение не получает производительность. Так, я просто думал, каков может быть лучший подход для обработки этого сценария?

Это будет действительно большая справка от Вас парни для комментария этого.

Спасибо

6
задан Greg Hewgill 19 January 2010 в 06:46
поделиться

4 ответа

Для этого можно использовать модуль win32gui. Сначала нужно получить действительный дескриптор на окне. Можно использовать win32gui.FindWindow , если известно имя класса окна или точное название. В противном случае можно перечислить окна с помощью win32gui.EnumWindows и попытаться найти нужное.

После получения дескриптора его можно вызвать win32gui.SetForegroundWindow . Оно активирует окно и будет готово для нажатия клавиш.

См. пример ниже. Я надеюсь, что это поможет

import win32gui
import re


class WindowMgr:
    """Encapsulates some calls to the winapi for window management"""

    def __init__ (self):
        """Constructor"""
        self._handle = None

    def find_window(self, class_name, window_name=None):
        """find a window by its class_name"""
        self._handle = win32gui.FindWindow(class_name, window_name)

    def _window_enum_callback(self, hwnd, wildcard):
        """Pass to win32gui.EnumWindows() to check all the opened windows"""
        if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) is not None:
            self._handle = hwnd

    def find_window_wildcard(self, wildcard):
        """find a window whose title matches the wildcard regex"""
        self._handle = None
        win32gui.EnumWindows(self._window_enum_callback, wildcard)

    def set_foreground(self):
        """put the window in the foreground"""
        win32gui.SetForegroundWindow(self._handle)


w = WindowMgr()
w.find_window_wildcard(".*Hello.*")
w.set_foreground()
-121--1719108-

Если вы посмотрите примеры кода CUDA SDK, они имеют внешний C определяет, что ссылки функции, скомпилированные из файлов .cu. Таким образом, файлы .cu компилируются nvcc и связываются только с основной программой, в то время как файлы .cpp компилируются нормально.

Например, в marchingCubes_kernel.cu имеет функцию body:

extern "C" void
launch_classifyVoxel( dim3 grid, dim3 threads, uint* voxelVerts, uint *voxelOccupied, uchar *volume,
                      uint3 gridSize, uint3 gridSizeShift, uint3 gridSizeMask, uint numVoxels,
                      float3 voxelSize, float isoValue)
{
    // calculate number of vertices need per voxel
    classifyVoxel<<<grid, threads>>>(voxelVerts, voxelOccupied, volume, 
                                     gridSize, gridSizeShift, gridSizeMask, 
                                     numVoxels, voxelSize, isoValue);
    cutilCheckMsg("classifyVoxel failed");
}

В то время как в maringCubes.cpp (где main () находится) просто имеет определение:

extern "C" void
launch_classifyVoxel( dim3 grid, dim3 threads, uint* voxelVerts, uint *voxelOccupied, uchar *volume,
                      uint3 gridSize, uint3 gridSizeShift, uint3 gridSizeMask, uint numVoxels,
                      float3 voxelSize, float isoValue);

Вы можете поместить их в файл .h тоже.

-121--2708683-

Возможно, вместо этого можно попробовать использовать базу данных Sqlite .

4
ответ дан 17 December 2019 в 04:47
поделиться

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

Раньше:

<jsp:include page="..."></jsp:include>

Я изменился так,

<jsp:include page="..."/>

Теперь я не получил этот тип исключения.

-121--3464961-

Всегда вполне сложно предоставить точные ответы только с проблемой системы, но вы фактически пытались проверить фактическую пропускную способность?

как первое решение, я бы просто Рекомендую использовать выделенный диск (так что нет одновременных действий чтения / записи от других процессов), а на это. Таким образом, это было бы только некоторую стоимость аппаратного обновления, и все мы знаем, что оборудование обычно дешевле, что программное обеспечение;) Вы можете даже перейти на RAID-контроллер для максимизации пропускной способности.

Если вы все еще ограничены пропускной способностью диска, есть новые технологии, использующие там технологии Flash: USB-ключей (хотя это может показаться не очень профессиональным), или «новые» твердотельные накопители могут обеспечить большее, чем механический диск.

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

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

Обратите внимание, что если чтение последовательно, я нахожу его более «естественным», чтобы попробовать подход «трубы» (ALA UNIX), чтобы два процесса выполнялись одновременно. В традиционной трубе данные могут не попасть на диск в конце концов.

Стыдно, не так ли, что в этом возрасте подавляющей мощности обработки мы все еще борется с нашим диском IO?

1
ответ дан 17 December 2019 в 04:47
поделиться

Если ваше приложение читает, последовательное миграция данных до БД не поможет увеличить производительность. Если используется произвольный доступ, вы должны рассмотреть возможность перемещения данных в БД, особенно если используются разные показатели. Вы должны проверить, доступны ли доступны достаточно ли доступны достаточно ресурсов, если они загружены в комплектую памяти Virtual Memory Management Management может оказать влияние на производительность (обмен, пейджинг). В зависимости от вашей ОС установки предел для файла в буферах IO могут быть достигнуты. Сама файловая система может быть фрагментирована. Чтобы получить качественный ответ HIGER, вы должны предоставить информацию об оборудовании, ОС, памяти и файловой системе. И так, как ваш файл данных используется. Чем вы могли бы получить подсказки о настройке ядра и т. Д.

0
ответ дан 17 December 2019 в 04:47
поделиться

Так что же здесь за механизм поиска? Как ваше приложение узнает, в каком из меньших файлов искать запись? Если вы разделили большой файл, не реализовав какую-то форму поиска по ключу - индексацию, разметку - вы не решили проблему, а просто переупорядочили его.

Конечно, если вы реализовали некую форму индексирования, то вы начали строить свою собственную базу данных.

Не зная больше о Вашей заявке, было бы опрометчиво давать конкретные советы. Возможно, решением будет применение решения СУБД. Возможно, лучше было бы использовать NoSQL-подход. Возможно, вам понадобится текстовый механизм индексирования и поиска.

Итак...

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

0
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: